正则表达帮助

时间:2011-02-16 22:09:16

标签: ruby regex ruby-on-rails-3 gsub

我目前正在使用带有gsub()的正则表达式对字符串进行大量处理,但是我将它们严重链接起来,这开始变得混乱。你能帮我构建一个单一的正则表达式:

string.gsub(/\.com/,'').gsub(/\./,'').gsub(/&/,'and').gsub(' ','-').gsub("'",'').gsub(",",'').gsub(":",'').gsub("#39;",'').gsub("*",'').gsub("amp;",'')

基本上上面的内容删除了以下内容:

  • .COM
  • *
  • 开关'&'为'和'
  • 为' - '
  • 切换''
  • 开关'for''

有更简单的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以组合删除字符的那些:

string.gsub(/\.com|[.,:*]/,'')

|表示“或”。 or的右边是一个字符类;它的意思是“其中一个角色”。

答案 1 :(得分:1)

随着您添加更多选项,转换表的可扩展性更高:

translations = Hash.new
translations['.com'] = ''
translations['&'] = 'and'
...

translations.each{ |from, to| string.gsub from, to }

答案 2 :(得分:0)

以蒂姆的回答为基础:

你可以将一个块传递给String.gsub,这样你就可以将它们全部组合起来,如果你愿意的话:

string.gsub(/\.com|[.,:*& ']/) do |sub|
    case(sub)
    when '&'
        'and'
    when ' '
        '-'
    else
        ''
    end
end

或者,根据echoback的答案,您可以在块中使用翻译哈希(您可能需要调用translations.default = ''才能使其正常工作):

string.gsub(/\.com|[.,:*& ']/) {|sub| translations[sub]}

使用块的最大好处是只有一次调用gsub(不是有史以来最快的函数)。

希望这有帮助!