我想&%*@()!{}
从字符串中删除字符。我试过这段代码:
keyword.gsub!(/[\&\%\*\@\(\)\!\{\}]/, '')`
但它失败了。
我想&%*@()!{}
从字符串中删除字符。我试过这段代码:
keyword.gsub!(/[\&\%\*\@\(\)\!\{\}]/, '')`
但它失败了。
你的正则表达式不正确。看来您不了解[...]
正则表达式的工作原理。
您可以使用:
gsub(/[&%*@()!{}]+/, '')
例如:
'foo&%*@()!{}bar'.gsub(/[&%*@()!{}]+/, '') # => "foobar"
不使用正则表达式的另一种方法是使用以下tr
方法:
'foo&%*@()!{}bar'.tr('&%*@()!{}', '') # => "foobar"
使用tr
,AKA“翻译”的好处是它不需要正则表达式,并且可以像这里一样进行删除,或者从一个字符翻译到另一个字符。它也非常快。
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(' ')
音译将删除单词的重音,正则表达式只会收集该范围内的字符,最后“连接”会将单词与它们之间的空格连接起来。