2

我想&%*@()!{}从字符串中删除字符。我试过这段代码:

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

但它失败了。

4

2 回答 2

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)
于 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 回答