我想将以下保留字符替换为空格:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \
这是我的代码,但它不起作用。我错过了什么吗?
keyword = keyword.gsub(/\\+-&\\|!\\(\\)\\{\\}\\[\\]\\^"~\\*\\?:\\\\/, ' ')
我想将以下保留字符替换为空格:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \
这是我的代码,但它不起作用。我错过了什么吗?
keyword = keyword.gsub(/\\+-&\\|!\\(\\)\\{\\}\\[\\]\\^"~\\*\\?:\\\\/, ' ')
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 完成了几个基准测试,并且对我所看到的速度改进感到非常满意。
这tr
是为了:
keyword.tr '-+&|!(){}[]^"~*?:\\', " "
#=> " "
就这样做吧。
keyword.gsub!(/[+\-&|!(){}\[\]^"~*?:\\]/, " ")
查看:
>> keyword = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
=> "+ - & | ! ( ) { } [ ] ^ \" ~ * ? : \\"
>> keyword.gsub!(/[+\-&|!(){}\[\]^"~*?:\\]/, " ")
=> " "
在这种情况下,字符类(由 括起来[]
)更容易推理。你需要逃避-
and[
和]
and \
。
\W = 任何非单词字符
>> keyword = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
=> "+ - & | ! ( ) { } [ ] ^ \" ~ * ? : \\"
>> keyword.gsub!(/\W/," ")
=> " "