Как мне обрабатывать специальные символы в регулярных выражениях Perl? - PullRequest
9 голосов
/ 23 февраля 2009

Я использую программу Perl для извлечения текста из файла. У меня есть массив строк, которые я использую в качестве разделителей для текста, например:

$pat = $arr[1] . '(.*?)' . $arr[2];

if ( $src =~ /$pat/ ) {
   print $1;
}

Однако две строки в массиве - $450 и (Buy now). Проблема в том, что символы в строках представляют конец строки и группу захвата в регулярных выражениях Perl, поэтому текст не анализируется, как я собираюсь.

Есть ли способ обойти это?

Ответы [ 3 ]

13 голосов
/ 23 февраля 2009

Попробуйте Perl's quotemeta . Либо используйте \Q и \E в своем регулярном выражении, чтобы отключить интерполяцию значений в регулярном выражении. См. perlretut , чтобы узнать больше о \Q и \E - они могут не соответствовать вашим требованиям.

10 голосов
/ 23 февраля 2009

quotemeta экранирует метасимволы, поэтому они интерпретируются как литералы. В качестве ярлыка вы можете использовать \ Q ... \ E в контексте двойных кавычек для окружения того, что должно быть заключено в кавычки:

$pat = quotemeta($arr[1]).'(.*?)'.quotemeta($arr[2]);
if($src=~$pat) { print $1 }

или

$pat = "\Q$arr[1]\E(.*?)\Q$arr[2]";  # \E not necessary at the end
if($src=~$pat) { print $1 }

или просто

if ( $src =~ /\Q$arr[1]\E(.*?)\Q$arr[2]/ ) { print $1 }

Обратите внимание, что это не ограничено интерполированными переменными; затрагиваются и буквенные символы:

perl -wle'print "\Q.+?"'
\.\+\?

хотя, очевидно, это происходит после интерполяции переменных, поэтому "\ Q $ foo" не становится "\ $ foo".

4 голосов
/ 23 февраля 2009

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

$pat = quotemeta($arr[1]) . '(.*?)' . quotemeta($arr[2]);
if ($src =~ $pat) 
    print $1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...