Другой способ вместо ускорения шаблонов регулярных выражений?
Обычно, когда мои шаблоны регулярных выражений выглядят так:
http://www.microsoft.com/
Тогда я должен бежать так:
string.match(/http:\/\/www\.microsoft\.com\//)
Есть ли другой способ вместо того, чтобы сбежать от него?
Я хочу иметь возможность использовать его как http://www.microsoft.com, потому что я не хочу избегать всех специальных символов в все мои шаблоны.
Ответы
Ответ 1
Regexp.new(Regexp.quote('http://www.microsoft.com/'))
Regexp.quote
просто ускользает от любых символов, имеющих специальное значение регулярного выражения; он берет и возвращает строку. Обратите внимание, что .
также является особенным. После цитирования вы можете добавить в regexp по мере необходимости, прежде чем перейти к конструктору. Простой пример:
Regexp.new(Regexp.quote('http://www.microsoft.com/') + '(.*)')
Это добавляет группу захвата для остальной части пути.
Ответ 2
Вы также можете использовать произвольные разделители в Ruby для регулярных выражений с помощью% r и определения символа перед регулярным выражением, например:
%r!http://www.microsoft.com/!
Ответ 3
Regexp.quote
или Regexp.escape
можно использовать для автоматического удаления вещей для вас:
http://ruby-doc.org/core/classes/Regexp.html#M001195
Результат можно передать в Regexp.new
, чтобы создать объект Regexp, а затем вы можете вызвать метод object .match
и передать ему строку, которая должна соответствовать (противоположный порядок от string.match(/regex/)
).
Ответ 4
Вы можете просто использовать одинарные кавычки для экранирования.
string.match('http://www.microsoft.com/')
вы также можете использовать %q{}
, если вам нужны одинарные кавычки в самом тексте. Если вам нужны переменные, экстраполированные внутри строки, используйте %q{}
. Это эквивалентно двойным кавычкам "
.
Если строка содержит выражения регулярных выражений (например: .*?()[]^$
), которые вы хотите экстраполировать, используйте//или% r {}
Ответ 5
Для удобства я просто определяю
def regexcape(s)
Regexp.new(Regexp.escape(s))
end