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

时间:2011-09-22 08:57:30

标签: ruby regex

我想用最简单的方法从字符串中删除所有字符。 例如 从"a,sd3 31ds""asdds" 我做这样的事情:

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

但看起来有点尴尬。也许可以将这些rexegs合并为一个?

6 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分: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)

答案 2 :(得分:5)

您可以使用正则表达式“OR”执​​行此操作。

"205h2n0bn  r0".gsub(/\W|\d/, "")

会做到这一点:)

答案 3 :(得分:4)

怎么样?
"a,sd3 31ds".gsub(/\W|\d/,"")

您始终可以通过|加入正则表达式来表达“或”。

答案 4 :(得分:4)

你可以试试这个正则表达式:

\P{L}

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

答案 5 :(得分:4)

非正则表达式解决方案:

"a,sd3 31ds".delete('^A-Za-z')