2016-11-21 4 views
1

У меня возникли проблемы с сопоставлением одной строки с другой, если строка, которую я тестирую, содержит символы регулярных выражений.Сопоставьте подстроку, которая может содержать зарезервированные символы

Фон: Я работаю над скриптом, который переносит статьи новостей из 2 устаревших систем в один. В некоторых случаях эти истории дублируются внутри систем, поэтому я запускаю скрипт для проверки сохраненных данных в архиве (в форме html), чтобы узнать, соответствует ли название текущей истории чему-либо в архиве.

#...(for each line) 
line.match(title) then 
    return true 
end 

Это обычно работает, за исключением того, когда у меня есть регулярное выражение символ в названии, например:

<span class="title">$8.9 Million Grant for UC Center Focused on Occupational Safety and Health</span> 

не соответствует

$8.9 Million Grant for UC Center Focused on Occupational Safety and Health 

Вот пример вывода из IRB в продемонстрировать

2.3.0 :012 > str = '<span class="title">$8.9 Million Grant for UC Center Focused on Occupational Safety and Health</span>' 
2.3.0 :020 > str.match("$8.9 Million Grant for UC Center Focused on Occupational Safety and Health") 
=> nil 
2.3.0 :021 > str.match("\\$8.9 Million Grant for UC Center Focused on Occupational Safety and Health") 
=> #<MatchData "$8.9 Million Grant for UC Center Focused on Occupational Safety and Health"> 
2.3.0 :022 > str.match("8.9 Million Grant for UC Center Focused on Occupational Safety and Health") 
=> #<MatchData "8.9 Million Grant for UC Center Focused on Occupational Safety and Health"> 
2.3.0 :023 > 

Итак, я уверен, что проблема $ является проблемой, и проблема связана с тем, что она является рекурсивным символом регулярного выражения.

Ruby не является моим повседневным языком, и у меня возникают проблемы с тем, чтобы посмотреть, есть ли метод ruby ​​для выполнения матча, не полагаясь на регулярное выражение, или обрабатывать шаблон буквально, или автоматически избегать специальных символов регулярного выражения. Помощь приветствуется.

+0

Вы приняли первый ответ, предложенный всего через 15 минут ?? –

+1

Это сработало, и это было кратким. – bstockwell

+0

Есть несколько причин для ожидания (хотя бы пару часов, скажем), прежде чем выбрать ответ. Во-первых, ранний отбор может препятствовать другим ответам. В этом случае, если @philomony не предложили ответа (и никто другой не дал ответ)? Во-вторых, это замыкает те, кто все еще готовит ответы. В-третьих, выбранный ответ иногда ошибочен, и вы не хотите препятствовать членам его проверять. Более того, я не знаю, как правильно выбрать ответ. –

ответ

1
str.match(Regexp.new(Regexp.escape("$8.9 Million ..."))) 
=> #<MatchData "$8.9 Million Grant for UC Center Focused... 
+0

Спасибо. Вот и все. – bstockwell

2

Если вы не нуждаетесь в MatchData (например, где в строке целевой текст происходит), гораздо более простое решение было бы использовать String#include?:

str.include?("$8.9 Million") 
# => true 

Если вы сделать требуется место, где встречается совпадение, с использованием String#index все еще проще:

str.index("$8.9 Million") 
# => 20 
+0

Собирался предлагать то же самое, как только я понял цель. –

Смежные вопросы