use strict;
my $str = 'rain. bright sunlight. a dog\'s bark.
rain. bright rain. a dog\'s bark.
Barksunlight rain
bark sun rain
bar sunlight sunlight
Rain rain rain
sunlight rain bark
Barking dog, sunlight, rainforest
Barking elephant, green Sunlight, purple rain and other non-sense
';
my $regex = qr/^ # begin of string
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 1th capturing group
(?:\brain\b|\bsunlight\b|\bbark) # Alternation group (answers) \b word-boundaries as needed
)
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 3th capturing group
(?:(?!(?:\1|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured in group 1 or 3
)
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 4th capturing group
(?:(?!(?:\2|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured by group 2 or 3
)
(?:(?!(?:\1|\2|\3)).)* # anything that is not captured by group 1,2,or 3
$ # end of string/xmip;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Perl, please visit: http://perldoc.perl.org/perlre.html