我想从字符串中删除字符&%*@()!{}
。我试过这段代码:
keyword.gsub!(/[\&\%\*\@\(\)\!\{\}]/, '')`
但失败了。
答案 0 :(得分:9)
你的正则表达式是不对的。您似乎无法理解[...]
在正则表达式中的工作原理。
您可以使用:
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)
答案 1 :(得分:0)
您可以使用I18n的音译:
require 'i18n'
I18n.transliterate(keyword).scan(/\w+[a-zA-Z0-9]/).join(' ')
Transliterate将删除单词的重音,而正则表达式将仅收集该范围内的字符,最后,“ join”将单词之间的空格连接起来。