Экранирование специальных символов в 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!"
}
вы можете избежать набора специальных символов в выражении, используя следующую команду.
expression1 = ' текст со специальными символами, такими как $ % ()';
expression1 =~s / [\?*+\\^$[]\(){}\|-]/"\$&"/например,
это будет избежать всех специальных символов
печать "expression1'; # текст со специальными символами, такими как \$ \% ( )
со ссылкой на $pattern
побеждает цель регулярных выражений, если он не используется как известный литерал и не сбрасывается в реальное регулярное выражение.
редактировать
В противном случае, просто используйте index()
чтобы найти положение подстроки. С этой информацией просто используйте substr()
извлечь окружающие данные при необходимости.