Справка по регулярным выражениям - PullRequest
0 голосов
/ 17 февраля 2011

В настоящее время я выполняю кучу обработки строки с использованием регулярных выражений с gsub(), но я довольно сильно их связываю, что начинает запутываться.Можете ли вы помочь мне создать единственное регулярное выражение для следующего:

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

В основном вышесказанное удаляет следующее:

  • .com
  • .
  • ,
  • :
  • *
  • переключатели '&' for 'и'
  • переключатели '' for '-'
  • switch 'for' '

Есть ли более простой способ сделать это?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Вы можете объединить те, которые удаляют символы:

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

Труба | означает «или». Правая часть или является классом символов; это означает «один из этих символов».

1 голос
/ 17 февраля 2011

Таблица перевода становится более масштабируемой при добавлении дополнительных параметров:

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

translations.each{ |from, to| string.gsub from, to }
0 голосов
/ 17 февраля 2011

Опираясь на ответ Тима:

Вы можете передать блок на 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 (не самая быстрая функция за всю историю).

Надеюсь, это поможет!

...