4

次の予約済み文字をスペースに置き換えたい:

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

これは私のコードですが、機能しません。私は何かを逃しましたか?

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

4 に答える 4

10

これがtr目的です:

keyword.tr '-+&|!(){}[]^"~*?:\\', " "
#=> "                                   "
于 2013-03-12T05:41:36.467 に答える
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 に答える
4

これを行うだけです。

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

小切手:

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

この場合、文字クラス(で囲まれている[])の方が簡単に推論できます。あなたは脱出する必要があります-そして[そして]そして\

于 2013-03-12T05:28:28.043 に答える
0

\W=単語以外の文字

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