Как я могу преобразовать строку в регулярное выражение, которое соответствует самому себе в Perl? - PullRequest
4 голосов
/ 21 октября 2009

Как я могу преобразовать строку в регулярное выражение, которое совпадает с самим собой в Perl?

У меня есть такой набор строк:

Enter your selection:
Enter Code (Navigate, Abandon, Copy, Exit, ?):

и я хочу преобразовать их в регулярные выражения, так что я могу сопоставить что-то еще с ними. В большинстве случаев строка совпадает с регулярным выражением, но не во втором примере выше, потому что (и? Имеют значение в регулярных выражениях. Так что вторая строка должна стать выражением типа:

Enter Code \(Navigate, Abandon, Copy, Exit, \?\):

Мне не нужно, чтобы совпадение было слишком строгим, поэтому что-то вроде этого было бы хорошо:

Enter Code .Navigate, Abandon, Copy, Exit, ..:

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

s/[\?\(\)]/./g;

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

Спасибо.

Ответы [ 5 ]

18 голосов
/ 21 октября 2009

Как заметил Брэд Гилберт, quotemeta :

my $regex = qr/^\Q$string\E$/;

или

my $quoted = quotemeta $string;
my $regex2 = qr/^$quoted$/;
7 голосов
/ 22 октября 2009

Для этого есть функция quotemeta.

quotemeta EXPR
Возвращает значение EXPR со всеми не "словесными" символами Такими управляющими последовательностями. (То есть все персонажи не соответствует /[A-Za-z_0-9]/ будет предшествует обратный слеш в возвращаемая строка, независимо от любого Настройки локали.) Это внутренний функция, реализующая экранирование \Q в строки в двойных кавычках.

Если EXPR опущен, используется $_.

3 голосов
/ 22 октября 2009

Зачем вообще использовать регулярное выражение? Поскольку вы не делаете никаких захватов и, похоже, вы не будете допускать никаких изменений, почему бы просто не использовать встроенную функцию index?

$s1 = 'hello, (world)?!';
$s2 = 'he said "hello, (world)?!" and nothing else.';

if ( -1 != index  $s2, $s1 ) {
    print "we've got a match\n";
}
else {
    print "sorry, no match.\n";
}
3 голосов
/ 21 октября 2009

Чтобы вставить предложение Брэда Гилберта в ответ вместо комментария, вы можете использовать функцию quotemeta . Вся заслуга ему

3 голосов
/ 21 октября 2009

С http://www.regular -expressions.info / characters.html :

есть 11 символов с особым значением: открывающая квадратная скобка [, обратный слеш \, каретка ^, знак доллара $, точка или точка ., вертикальная черта или символ трубы |, знак вопроса ?, звездочка или звезда *, знак плюс +, открывающая круглая скобка ( и закрывающая круглая скобка )

В Perl (и PHP) есть специальная функция quotemeta , которая избавит вас от всего этого.

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