Подтвердить что ты не робот

Создайте не зависящее от регистра регулярное выражение из строки в Ruby

Скажем, что у меня есть произвольная строка типа

`A man + a plan * a canal : Panama!`

и я хочу выполнить поиск в регулярном выражении для строк, которые не совпадают с случаем. То есть, это регулярное выражение должно соответствовать строке

`A man + a plan * a canal : Panama!`

Лучше всего использовать обратную косую черту - каждый символ со специальным значением в регулярных выражениях Ruby, а затем Regexp.new с этой строкой и Regexp::IGNORECASE в качестве аргументов. Это правильно? Есть ли проверенное и правильное регулярное выражение для преобразования произвольных строк в литературные регулярные выражения?

Кстати, я в конечном итоге хочу использовать это регулярное выражение для выполнения произвольного запроса на запрос MongoDB без учета регистра. Поэтому, если бы я мог это сделать, пожалуйста, дайте мне знать.

4b9b3361

Ответ 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

Конечно, это сводится к личным предпочтениям.