次の予約済み文字をスペースに置き換えたい:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \
これは私のコードですが、機能しません。私は何かを逃しましたか?
keyword = keyword.gsub(/\\+-&\\|!\\(\\)\\{\\}\\[\\]\\^"~\\*\\?:\\\\/, ' ')
次の予約済み文字をスペースに置き換えたい:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \
これは私のコードですが、機能しません。私は何かを逃しましたか?
keyword = keyword.gsub(/\\+-&\\|!\\(\\)\\{\\}\\[\\]\\^"~\\*\\?:\\\\/, ' ')
これがtr
目的です:
keyword.tr '-+&|!(){}[]^"~*?:\\', " "
#=> " "
との速度差を示すベンチマークは次の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でいくつかのベンチマークを実行し、これまでに見た速度の向上に非常に満足しています。
これを行うだけです。
keyword.gsub!(/[+\-&|!(){}\[\]^"~*?:\\]/, " ")
小切手:
>> keyword = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
=> "+ - & | ! ( ) { } [ ] ^ \" ~ * ? : \\"
>> keyword.gsub!(/[+\-&|!(){}\[\]^"~*?:\\]/, " ")
=> " "
この場合、文字クラス(で囲まれている[]
)の方が簡単に推論できます。あなたは脱出する必要があります-
そして[
そして]
そして\
。
\W=単語以外の文字
>> keyword = '+ - & | ! ( ) { } [ ] ^ " ~ * ? : \\'
=> "+ - & | ! ( ) { } [ ] ^ \" ~ * ? : \\"
>> keyword.gsub!(/\W/," ")
=> " "