Продолжение совпадения регулярного выражения после успешного совпадения - PullRequest
0 голосов
/ 29 ноября 2011

Для кода ниже, что мне нужно изменить (в моем регулярном выражении?), Чтобы он распечатывал все экземпляры регулярного выражения, которые появляются в этом совпадении в $string?

Итак, сейчас вывод - это только первый экземпляр, который соответствует регулярному выражению, но я хочу также распечатать следующие 2 экземпляра. Я думал, что / g в конце регулярного выражения сделает это.

#!/usr/bin/perl

$start = '<!--Start here-->';
$end = '<!--End now-->';
$string = "Lorem ipsum dolor sit amet, consectetur <!--Start here-->adipiscing elit. Maecenas gravida dictum erat et sollicitudin. Class aptent taciti sociosqu ad litora torquent per <!--End now-->conubia nostra, per inceptos himenaeos. <!--Start here-->Mauris ac elementum enim. <!--End now-->Etiam hendrerit accumsan sodales. Morbi mi tortor, adipiscing in interdum eu, volutpat quis neque. Aenean tincidunt ornare risus, id faucibus augue dictum ut. Nullam aliquet metus vel nibh ullamcorper ornare. Vestibulum a sapien augue. Praesent tellus nulla, congue non vestibulum eget, venenatis eu tellus. <!--Start here-->Donec varius porttitor blandit.<!--End now--> a sapien augue ipsum dolor.";
$string =~ m/(($start)(.+?)($end))/g;
print $1;

Ответы [ 4 ]

4 голосов
/ 29 ноября 2011

Вы делаете это в цикле:

print $1 while ($string =~ m/(($start)(.+?)($end))/g);
3 голосов
/ 29 ноября 2011

Просто измените способ печати результатов:)

while ($subject =~ m/(($start)(.+?)($end))/g) {
    print $1, "\n";
}
1 голос
/ 29 ноября 2011

Попробуйте

my @matches = $string =~ m/(($start)(.+?)($end))/g;

Для захвата их всех в массив @matches

0 голосов
/ 30 ноября 2011

Это, вероятно, не лучший способ для его захвата, если вы действительно не хотите, чтобы начальные, конечные, полные фразы, включая начало и конец, содержимое и т. Д. Оператор регулярного выражения возвращает результаты совпадений в контексте списка, и выиспользуйте это, чтобы сделать:

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

my $start = '<!--Start here-->';
my $end = '<!--End now-->';
my $string = "Lorem ipsum dolor sit amet, consectetur <!--Start here-->adipiscing elit. Maecenas gravida dictum erat et sollicitudin. Class aptent taciti sociosqu ad litora torquent per <!--End now-->conubia nostra, per inceptos himenaeos. <!--Start here-->Mauris ac elementum enim. <!--End now-->Etiam hendrerit accumsan sodales. Morbi mi tortor, adipiscing in interdum eu, volutpat quis neque. Aenean tincidunt ornare risus, id faucibus augue dictum ut. Nullam aliquet metus vel nibh ullamcorper ornare. Vestibulum a sapien augue. Praesent tellus nulla, congue non vestibulum eget, venenatis eu tellus. <!--Start here-->Donec varius porttitor blandit.<!--End now--> a sapien augue ipsum dolor.";

my @matches = ($string =~ m/$start(.+?)$end/g);
say for @matches;

Выходы:

adipiscing elit. Maecenas gravida dictum erat et sollicitudin. Class aptent taciti sociosqu ad litora torquent per
Mauris ac elementum enim.
Donec varius porttitor blandit.

т.е. не возиться с $1 $2 $3 и т. д.

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