文字列から文字を削除したい&%*@()!{}
。私はこのコードを試しました:
keyword.gsub!(/[\&\%\*\@\(\)\!\{\}]/, '')`
しかし、それは失敗しました。
文字列から文字を削除したい&%*@()!{}
。私はこのコードを試しました:
keyword.gsub!(/[\&\%\*\@\(\)\!\{\}]/, '')`
しかし、それは失敗しました。
あなたの正規表現は正しくありません。[...]
正規表現での動作を理解していないようです。
以下を使用できます。
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)
I18n から文字変換を使用できます。
require 'i18n'
I18n.transliterate(keyword).scan(/\w+[a-zA-Z0-9]/).join(' ')
文字変換は単語のアクセントを削除し、正規表現はその範囲内の文字のみを収集し、最終的に「結合」はそれらの間にスペースを入れて単語を連結します。