去除所有非单词字符的简便方法

8

我希望用最简单的方法从字符串中删除所有字符。 例如,从"a,sd3 31ds"变成"asdds"。 我可以像这样做:

"a,sd3 31ds".gsub(/\W/, "").gsub(/\d/,"")
# => "asdds"

但是看起来有点尴尬。也许可以将这些正则表达式合并为一个?

6个回答

20
"a,sd3 31ds".gsub(/(\W|\d)/, "")

12

我会选择正则表达式 /[\W\d]+/。相比于/(\W|\d)/这种写法,它的速度有可能更快。

require 'benchmark' 

N = 500_000
Regexps = [ "(\\W|\\d)", "(\\W|\\d)+", "(?:\\W|\\d)", "(?:\\W|\\d)+", 
            "\\W|\\d", "[\\W\\d]", "[\\W\\d]+" ]

Benchmark.bm(15) do |x|  
  Regexps.each do | re_str |
    re = Regexp.new(re_str)
    x.report("/#{re_str}/:") { N.times { "a,sd3 31ds".gsub(re, "") }}
  end
end   

在 Ruby 2.0.0p195 [x64-mingw32] 版本中提供了该功能。

                      user     system      total        real
/(\W|\d)/:        1.950000   0.000000   1.950000 (  1.951437)
/(\W|\d)+/:       1.794000   0.000000   1.794000 (  1.787569)
/(?:\W|\d)/:      1.857000   0.000000   1.857000 (  1.855515)
/(?:\W|\d)+/:     1.638000   0.000000   1.638000 (  1.626698)
/\W|\d/:          1.856000   0.000000   1.856000 (  1.865506)
/[\W\d]/:         1.732000   0.000000   1.732000 (  1.754596)
/[\W\d]+/:        1.622000   0.000000   1.622000 (  1.617705)

5
你可以使用正则表达式中的“OR”来实现这一点。
"205h2n0bn  r0".gsub(/\W|\d/, "")

这样做就可以解决问题 :)


4
关于这个问题
"a,sd3 31ds".gsub(/\W|\d/,"")

您可以通过使用|将正则表达式连接起来表示“或”。


4
你可以尝试使用这个正则表达式:
\P{L}

不是Unicode字母,但我不确定Ruby是否支持这个类。


4
一种非正则表达式的解决方案:
"a,sd3 31ds".delete('^A-Za-z')

"a,sd3[] 31ds".delete('^A-z') => "asd[]ds" - undur_gongor
@undur_gongor:啊,好的。我会修复它。 - steenslag
1
@steenslag 括号之间的部分不是正则表达式部分吗?您的意思是“非 #gsub 解决方案”,还是我理解错了? - Viktor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接