Экранирование специальных символов в регулярных выражениях Perl - PullRequest
6 голосов
/ 15 сентября 2011

Я пытаюсь сопоставить регулярное выражение в Perl. Мой код выглядит следующим образом:

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ($source =~ m/$pattern/) {
  print "Match found!"
}

Проблема возникает в том, что в скобках указывается класс символов (или, как я читал), когда Perl пытается сопоставить регулярное выражение, и совпадение заканчивается неудачей. Я знаю, что могу выйти за скобки с помощью \[ или \], но для этого потребуется еще один блок кода, чтобы пройти строку и найти скобки. Есть ли способ автоматически игнорировать скобки, не выходя из них по отдельности?

Краткое примечание: я не могу просто добавить обратную косую черту, так как это всего лишь пример. В моем реальном коде $source и $pattern оба поступают извне кода Perl (либо URIEncoded, либо из файла).

Ответы [ 5 ]

12 голосов
/ 15 сентября 2011

\Q будет отключать метасимволы, пока не будет найден \E или конец шаблона.

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ($source =~ m/\Q$pattern/) {
  print "Match found!"
}

http://www.anaesthetist.com/mnm/perl/Findex.htm

11 голосов
/ 15 сентября 2011

Использование quotemeta () :

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = quotemeta("Hello_[version]");
if ($source =~ m/$pattern/) {
  print "Match found!"
}
10 голосов
/ 15 сентября 2011

Вы используете неправильный инструмент для задания.

У вас нет шаблона!В $ pattern нет НИКАКИХ символов регулярного выражения!

У вас есть буквенная строка.

index () для работы с буквенными строками ...

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ( index($source, $pattern) != -1 ) {
    print "Match found!";
}
0 голосов
/ 28 апреля 2015

Вы можете избежать набора специальных символов в выражении, используя следующую команду.

expression1 = 'текст со специальными символами, такими как $% ()';

expression1 = ~ s /[\? * + \ ^ \ $ [] \ () {} \ | -] / "\ $ &" / например;

При этом будут удалены все специальные символы

print "expression1 '; # текст со специальными символами, такими как \ $ \% ()

0 голосов
/ 15 сентября 2011

Цитирование $pattern отрицает цель регулярных выражений, если только оно не используется в качестве известного литерала и не выводится в реальное регулярное выражение.

edit
В противном случае просто используйтеindex() чтобы найти положение подстроки.С этой информацией просто используйте substr() для извлечения окружающих данных при необходимости.

...