4

我想将以下保留字符替换为空格:

+ - & | ! ( ) { } [ ] ^ " ~ * ? : \

这是我的代码,但它不起作用。我错过了什么吗?

keyword = keyword.gsub(/\\+-&\\|!\\(\\)\\{\\}\\[\\]\\^"~\\*\\?:\\\\/, ' ')
4

4 回答 4

10

gsub这是一个基准,显示和之间的速度差异tr

require 'benchmark'
require 'pp'

STR = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
LONG_STR = STR * 1_000
N = 1_000

puts `ruby -v`

pp STR.gsub(/[+&|!(){}\[\]^"~*:?\\-]/, ' ')
pp STR.tr('-+&|!(){}[]^"~*?:\\', ' ')

Benchmark.bm(5) do |b|
  b.report('gsub') { N.times { LONG_STR.gsub(/[+&|!(){}\[\]^"~*:?\\-]/, ' ') } }
  b.report('tr') { N.times { LONG_STR.tr('+&|!(){}[]^"~*:?\\-', ' ') } }
end

和输出:

ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
"                                   "
"                                   "
          user     system      total        real
gsub  13.300000   0.190000  13.490000 ( 13.524779)
tr     0.080000   0.010000   0.090000 (  0.090045)

ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.0]
"                                   "
"                                   "
            user     system      total        real
gsub   17.890000   0.040000  17.930000 ( 18.016657)
tr      0.270000   0.000000   0.270000 (  0.283021)

ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
"                                   "
"                                   "
            user     system      total        real
gsub    7.310000   0.020000   7.330000 (  7.361403)
tr      0.140000   0.010000   0.150000 (  0.145816)

有趣的是,1.8.7 的表现优于 1.9.3。我怀疑这是因为在 1.9+ 中添加了多字节字符支持。

我已经使用 2.0 完成了几个基准测试,并且对我所看到的速度改进感到非常满意。

于 2013-03-12T12:12:41.287 回答
10

tr是为了:

keyword.tr '-+&|!(){}[]^"~*?:\\', " "
#=> "                                   "
于 2013-03-12T05:41:36.467 回答
4

就这样做吧。

keyword.gsub!(/[+\-&|!(){}\[\]^"~*?:\\]/, " ")

查看:

>> keyword = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
=> "+ - & | ! ( ) { } [ ] ^ \" ~ * ? : \\"
>> keyword.gsub!(/[+\-&|!(){}\[\]^"~*?:\\]/, " ")
=> "                                   "

在这种情况下,字符类(由 括起来[])更容易推理。你需要逃避-and[]and \

于 2013-03-12T05:28:28.043 回答
0

\W = 任何非单词字符

>> keyword = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
=> "+ - & | ! ( ) { } [ ] ^ \" ~ * ? : \\"
>> keyword.gsub!(/\W/," ")
=> "                                   "
于 2013-03-12T05:36:34.163 回答