Создать нечувствительное к регистру регулярное выражение из строки в Ruby - PullRequest
45 голосов
/ 06 августа 2010

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

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

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

`a man + A PLAN * a canal : PaNaMa!`

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

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

Ответы [ 4 ]

51 голосов
/ 06 августа 2010

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

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")
44 голосов
/ 02 апреля 2014

Регулярные выражения Ruby могут интерполировать выражения так же, как строки, используя нотацию #{}. Однако вы должны избегать любых специальных символов регулярных выражений. Например:

input_str = "A man + a plan * a canal : Panama!"
/#{Regexp.escape input_str}/i
26 голосов
/ 07 августа 2010

Если вы уже знаете нужное регулярное выражение, вы можете добавить «i» после выражения (например, /the center cannot hold it is too late/i), чтобы оно не чувствительно к регистру .

7 голосов
/ 20 ноября 2012

Немного более синтаксически-сахаристый способ сделать это - использовать нотацию %r для литералов Regexp:

input_str = "A man + a plan * a canal : Panama!"
%r(#{Regexp.escape(input_str)})i

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...