如何使用正则表达式从字符串中删除一些非法字符?

时间:2013-01-13 04:08:58

标签: ruby-on-rails ruby regex

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

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

但失败了。

2 个答案:

答案 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”将单词之间的空格连接起来。