0

我目前正在使用正则表达式对字符串进行一堆处理,gsub()但是我将它们链接得很重,这开始变得混乱。您能帮我为以下内容构建一个正则表达式吗:

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

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

  • .com
  • .
  • ,
  • *
  • 将“&”切换为“和”
  • 将“”切换为“-”
  • 切换'为''

有没有更简单的方法来做到这一点?

4

3 回答 3

3

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

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

管道的|意思是“或”。or的右边是一个字符类;它的意思是“这些字符之一”。

于 2011-02-16T22:12:34.160 回答
1

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

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

translations.each{ |from, to| string.gsub from, to }
于 2011-02-16T22:18:40.583 回答
0

基于蒂姆的回答:

您可以将一个块传递给String.gsub,因此您可以根据需要将它们全部组合起来:

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

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

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

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

希望这可以帮助!

于 2011-02-16T22:28:22.343 回答