我想用最简单的方法从字符串中删除所有字符。
例如
从"a,sd3 31ds"
到"asdds"
我做这样的事情:
"a,sd3 31ds".gsub(/\W/, "").gsub(/\d/,"")
# => "asdds"
但看起来有点尴尬。也许可以将这些rexegs合并为一个?
答案 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')