Экранированное регулярное выражение Ruby не дает соответствия при использовании в качестве литерального регулярного выражения.Зачем? - PullRequest
1 голос
/ 03 февраля 2012

Код говорит обо всем:

teststring = "helloworld$"
string_from_user = "world$"
regexp = Regexp.escape(string_from_user) # assigns "world\\$"
p teststring =~ Regexp.new(regexp) # prints 0 => match found
p teststring =~ /regexp/ # prints nil => no match

То, что соответствует первому, упоминается в Regexp.escape документах. Но почему не совпадает вторая версия?

Я обеспокоен тем, что мне нужно передать это регулярное выражение в сторонний код Ruby. Строка получена от пользователя, поэтому я хочу ее избежать. Затем в некоторых ситуациях я мог бы добавить дополнительные символы регулярного выражения в строку этого пользователя. Например, я мог бы передать "^helloworld\\$", чтобы сторонний код совпадал со строками типа "helloworld$othercontent".

Я обеспокоен тем, что если сторонний код использует =~ /regexp/ вместо =~ Regexp.new(regexp), у меня будут проблемы, потому что не будет совпадения, как указано кодом выше.

1 Ответ

8 голосов
/ 03 февраля 2012

Поскольку /regexp/ является регулярным выражением, совпадающим со строкой "regexp". Возможно, вы имели в виду /#{regexp}/?

Редактировать: Из более подробного прочтения вашего вопроса я понимаю, что вы передаете строку в сторонний код, который, как вы знаете, будет создавать регулярное выражение из этой строки. В этом случае вы должны быть в безопасности. Как отмечалось выше, /regexp/ не может быть тем, что они делают, потому что это просто неправильно . Они должны использовать Regexp.new() или что-то подобное.

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