-2

我有一个类似的字符串:

Frank's Red Hot

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

franks_red_hot

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

4

6 回答 6

5

有不止一种方法可以做到这一点

您可以通过多种方式执行此操作。但是,如果您没有其他考虑因素,我认为意图编码通常是最好的方法。就个人而言,我更喜欢:

"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。

于 2013-11-04T21:48:16.743 回答
1

你确定你需要正则表达式吗?这应该可以根据需要工作:

string.downcase.gsub("'", '').gsub(' ', '_')
于 2013-11-04T20:58:22.933 回答
1
"Frank's Red Hot".downcase!.gsub!("'","").gsub!(" ","_")

在提问之前,您确实应该尝试阅读Object 文档。

于 2013-11-04T20:59:01.687 回答
1
s = "Frank's Red Hot"
p s.tr(' ','_').delete("'").downcase #=>"franks_red_hot"
于 2013-11-04T21:01:07.307 回答
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)
于 2013-11-04T21:16:03.250 回答
1

gsub您可以使用哈希语法避免双重调用

s = "Frank's Red Hot"
s.downcase!.gsub(/[ ']/, ' ' => '_') #=> "franks_red_hot"
于 2013-11-04T21:16:58.890 回答