我有一个类似于此的字符串:
Frank's Red Hot
我需要一个正则表达式来删除撇号并用下划线替换空格,所以它看起来像这样:
franks_red_hot
如果它全部小写,奖励积分,但已经有一个功能,所以它没有必要。
答案 0 :(得分:4)
您可以通过多种方式执行此操作。但是,如果您没有其他考虑因素,我认为编写意图通常是最好的方法。就个人而言,我更喜欢:
"Frank's Red Hot".downcase.delete(?').tr ' ', ?_
#=> "franks_red_hot"
这避免了方法链中的bang方法,它可以在意想不到的地方返回nil,并且如果您更喜欢这种编码风格,也很容易拆分或转换为多种方法。
如果你关心临时值,或者需要调试代码,你总是可以在多行上使用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。
答案 1 :(得分:1)
您确定需要Regexp吗?这可以按你的需要工作:
string.downcase.gsub("'", '').gsub(' ', '_')
答案 2 :(得分:1)
"Frank's Red Hot".downcase!.gsub!("'","").gsub!(" ","_")
在提问之前,你真的应该尝试阅读Object documentation。
答案 3 :(得分:1)
s = "Frank's Red Hot"
p s.tr(' ','_').delete("'").downcase #=>"franks_red_hot"
答案 4 :(得分:1)
根据您使用的版本,您可以使用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)
答案 5 :(得分:1)
您可以使用哈希语法
来避免双gsub
次调用
s = "Frank's Red Hot"
s.downcase!.gsub(/[ ']/, ' ' => '_') #=> "franks_red_hot"