正则表达式删除撇号并用下划线替换空格

时间:2013-11-04 20:56:02

标签: ruby regex

我有一个类似于此的字符串:

Frank's Red Hot

我需要一个正则表达式来删除撇号并用下划线替换空格,所以它看起来像这样:

franks_red_hot

如果它全部小写,奖励积分,但已经有一个功能,所以它没有必要。

6 个答案:

答案 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"