2

文字列から文字を削除したい&%*@()!{}。私はこのコードを試しました:

keyword.gsub!(/[\&\%\*\@\(\)\!\{\}]/, '')`

しかし、それは失敗しました。

4

2 に答える 2

9

あなたの正規表現は正しくありません。[...]正規表現での動作を理解していないようです。

以下を使用できます。

gsub(/[&%*@()!{}]+/, '')

例えば:

'foo&%*@()!{}bar'.gsub(/[&%*@()!{}]+/, '') # => "foobar"

正規表現を使用せずにこれを行う別の方法は、次のtrメソッドを使用することです。

'foo&%*@()!{}bar'.tr('&%*@()!{}', '') # => "foobar"

、別名「翻訳」を使用する利点はtr、正規表現を使用せず、ここのように削除したり、ある文字から別の文字に翻訳したりできることです。また、非常に高速です。

require 'benchmark'

n = 1_000_000
Benchmark.bm() do |b|

  b.report { n.times { 'foo&%*@()!{}bar'.gsub(/[&%*@()!{}]+/, '') } }
  b.report { n.times { 'foo&%*@()!{}bar'.tr('&%*@()!{}', '')   } }

end

1.9.3-p362 を実行しているマシンで次のように返されます。

   user     system      total        real
4.120000   0.010000   4.130000 (  4.125929)
1.280000   0.000000   1.280000 (  1.282932)
于 2013-01-13T04:13:21.647 に答える
0

I18n から文字変換を使用できます。

require 'i18n'

I18n.transliterate(keyword).scan(/\w+[a-zA-Z0-9]/).join(' ')

文字変換は単語のアクセントを削除し、正規表現はその範囲内の文字のみを収集し、最終的に「結合」はそれらの間にスペースを入れて単語を連結します。

于 2020-03-10T14:29:09.337 に答える