Поскольку вы хотите, чтобы каждый питомец находился в отдельном матче, и вы используете PCRE, \G
, как предлагает Wiktor, является достойным вариантом:
(?:pets:)|\G(?!^)(\w+)(?:[,;]|$)
Объяснение:
- 1-я альтернатива
(?:pets:)
для поиска начала шаблона - 2-я альтернатива
\G(?!^)(\w+)(?:[,;]|$)
\G
устанавливает позицию в конце предыдущего совпадения или в начале строкиза первый матч - Negative Lookahead (?! ^), чтобы утверждать, что регулярное выражение не совпадает в начале строки
(\w+)
с совпадениями с домашними животными - Группа без захвата
(?:[,;]|$)
, используемая в качестве разделителя (соответствует одному символу в списке ,;
(с учетом регистра) или $
, устанавливает позицию в конце строки
Пример кода Perl:
use strict;
use Data::Dumper;
my $str = 'fruits:apple,banana;pets:cat,dog,bird;colors:green,blue';
my $regex = qr/(?:pets:)|\G(?!^)(\w+)(?:[,;]|$)/mp;
my @result = ();
while ( $str =~ /$regex/g ) {
if ($1 ne '') {
#print "$1\n";
push @result, $1;
}
}
print Dumper(\@result);