Создайте не зависящее от регистра регулярное выражение из строки в Ruby
Скажем, что у меня есть произвольная строка типа
`A man + a plan * a canal : Panama!`
и я хочу выполнить поиск в регулярном выражении для строк, которые не совпадают с случаем. То есть, это регулярное выражение должно соответствовать строке
`A man + a plan * a canal : Panama!`
Лучше всего использовать обратную косую черту - каждый символ со специальным значением в регулярных выражениях Ruby, а затем Regexp.new
с этой строкой и Regexp::IGNORECASE
в качестве аргументов. Это правильно? Есть ли проверенное и правильное регулярное выражение для преобразования произвольных строк в литературные регулярные выражения?
Кстати, я в конечном итоге хочу использовать это регулярное выражение для выполнения произвольного запроса на запрос MongoDB без учета регистра. Поэтому, если бы я мог это сделать, пожалуйста, дайте мне знать.
Ответы
Ответ 1
Вы можете использовать Regexp.escape
, чтобы избежать всех символов в строке, которые иначе обрабатывались бы с помощью механизма regexp.
Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE)
или
Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i")
Ответ 2
Регуляции Ruby могут интерполировать выражения так же, как и строки, используя нотацию #{}
. Однако вам нужно избегать специальных символов регулярных выражений. Например:
input_str = "A man + a plan * a canal : Panama!"
/#{Regexp.escape input_str}/i
Ответ 3
Если вы знаете уже правильное выражение, вы можете добавить "i" после выражения (например, /the center cannot hold it is too late/i
), чтобы сделать его нечувствительным к регистру.
Ответ 4
Несколько более синтаксически-призрачный способ сделать это - использовать нотацию %r
для литералов Regexp:
input_str = "A man + a plan * a canal : Panama!"
%r(#{Regexp.escape(input_str)})i
Конечно, это сводится к личным предпочтениям.