我有一个类似的字符串:
Frank's Red Hot
我需要一个正则表达式来删除撇号并用下划线替换空格,所以它看起来像这样:
franks_red_hot
如果它全部变成小写,奖励积分,但已经有一个功能,所以它没有必要。
您可以通过多种方式执行此操作。但是,如果您没有其他考虑因素,我认为意图编码通常是最好的方法。就个人而言,我更喜欢:
"Frank's Red Hot".downcase.delete(?').tr ' ', ?_
#=> "franks_red_hot"
这避免了方法链中的 bang 方法,它可能在意想不到的地方返回 nil,如果您更喜欢这种编码风格,也很容易分解或转换为多个 bang 方法。
如果你关心临时值,或者需要调试你的代码,你总是可以在多行上使用 bang 方法。这也将避免方法链中的 bang 方法。例如:
str = %q{Frank's Red Hot}
#=> "Frank's Red Hot"
str.downcase!
#=> "frank's red hot"
str.delete! ?'
#=> "franks red hot"
str.tr! ' ', ?_
#=> "franks_red_hot"
这种技术当然更容易调试,但显然更冗长。YMMV。
你确定你需要正则表达式吗?这应该可以根据需要工作:
string.downcase.gsub("'", '').gsub(' ', '_')
"Frank's Red Hot".downcase!.gsub!("'","").gsub!(" ","_")
在提问之前,您确实应该尝试阅读Object 文档。
s = "Frank's Red Hot"
p s.tr(' ','_').delete("'").downcase #=>"franks_red_hot"
根据您使用的版本,您可以使用String#gsub
替换参数实现哈希,同时使用正则表达式匹配您的子字符串。
str.downcase.gsub(/[' ]/, ' ' => '_')
# => franks_red_hot
与块一起使用:
re = { ' ' => '_' }
x = str.downcase.gsub /[' ]/ do |match|
re[match.to_s]
end
使用地图:
map = { "'" => '', ' ' => '_' }
re = Regexp.union(map.keys)
x = str.downcase.gsub(re, map)
gsub
您可以使用哈希语法避免双重调用
s = "Frank's Red Hot"
s.downcase!.gsub(/[ ']/, ' ' => '_') #=> "franks_red_hot"