Perl перебирает каждое совпадение - PullRequest
35 голосов
/ 28 сентября 2011

Допустим, я сканирую страницу необработанного HTML в поисках этого регулярного выражения.(Кавычка на конце является преднамеренной).

m/(https?:\/\/.*?(?:'|"))/

Этот шаблон, вероятно, будет соответствовать ~ 100 раз.Что такое распространенная идиома perl / быстрый способ перебора списка всех совпадений групп захвата?

Ответы [ 3 ]

56 голосов
/ 28 сентября 2011

Из perlretut (очень хороший учебник)

while ($x =~ /(\w+)/g) {
        print "Word is $1, ends at position ", pos $x, "\n";
    }

Вы можете использовать while вместе с модификатором g для итерации по всем совпадениям, с $1 вы получите содержимое вашей группы захвата 1, и в этом примере из урока вы также получите позицию с pos.

7 голосов
/ 28 сентября 2011

Модификатор глобального соответствия 'g' возвращает список захваченных совпадений в контексте списка:

say $_ for $str =~ /un($wanted)/g;    # Prints only $wanted
0 голосов
/ 16 июля 2012

@ Захид: Я думаю, что ваш подход более компактен. надеюсь, что следующий фрагмент поможет понять ваш пример

my $str = 'file_%date%_%name%_%lang%.txt';
my @ts = $str =~ /%([\w]+)%/g;#           <----------Zahid said
print join(", ", @ts);

Выход:

date, name, lang
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...