Perl регулярное выражение, как избежать только некоторые символы - PullRequest
8 голосов
/ 11 февраля 2012

У меня есть строка $regexp_as_string

Теперь я хочу "преобразовать" ее в регулярное выражение / использовать в качестве регулярного выражения

if ($text_to_search =~ $regexp_as_string)
{
...
}

Теперь есть такие символы, как "."и я хочу автоматически экранировать их - \ Q и \ E должны сделать это

 if ($text_to_search =~ /\Q$regexp_as_string\E/)
    {
    ...
    }

Есть ли способ указать список символов, которые должны быть автоматически экранированы?Потому что на данный момент таким образом авто уходит, например, "|", но я хочу сохранить это.

Ответы [ 3 ]

14 голосов
/ 11 февраля 2012

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

my $str = quotemeta('foo${}|'); 
$str =~ s/\\(?=[|])//g; 
say $str;

Выход:

foo\$\{\}|

Добавьте любые символы, которые вы не хотите экранировать, в класс символов в подстановке, например, [|?()].

0 голосов
/ 11 февраля 2012

с использованием примера строки TLP

my $str='foo${}|';
$str =~ s/([\.\{\}\$])/\\$1/g;
print $str;

Это ТОЛЬКО добавит обратную косую черту к символам в квадратных скобках "класса символов"

Обратите внимание, что я поставил перед черную чертусимволов в квадратных скобках.Это не всегда необходимо для всех символов в этом контексте, но проще просто добавить обратную косую черту и не беспокоиться об этом.

0 голосов
/ 11 февраля 2012

Возможно, вместо передачи строки, соединенной |для чередований получить список чередований и собрать их в строку (или даже разделить их на |, если это гарантированно никогда не появится)?Что-то вроде:

my @alternations = array_returning_function();
# my @alternations = split(/\|/, string_returning_function());
my $regexp_as_string = join('|', map(quotemeta, @alternations)); 

или используйте функцию Data :: Munge list2re:

use Data::Munge;
my @alternations = array_returning_function();
# my @alternations = split(/\|/, string_returning_function());
my $regexp_as_string = Data::Munge::list2re( @alternations );
...