Экранирование специальных символов в Perl regex

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

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

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

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

5 ответов


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

у вас нет картины! Нет регулярных выражений персонажи в $рисунком!

у вас есть строковый литерал.

index () предназначен для работы с литеральными строками...

my $source = "Hello_[version]; Goodbye_[version]";
my $pattern = "Hello_[version]";
if ( index($source, $pattern) != -1 ) {
    print "Match found!";
}

использовать quotemeta():

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

\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


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

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

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

это будет избежать всех специальных символов

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


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

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