use strict;
my $str = '^(?P<line>(?P<junk>(?!(?:Message\\-ID:)\\s(?:\\<)|(?:<)|(?:\\s))(?!(?:From:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:To:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:Reply\\-To:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:X\\-Sender:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:Return\\-Path:)\\s(?:\\<)|(?:<)|(?:")|(?:["]))(?!(?:Received\\-SPF:))[^\\r\\n]*)(?P<wtf>(?:(?:\\"(?P<display_name>[^\\"\\r\\n]*)\\"\\s*)?\\b(?P<email>(?P<username>[A-Z0-9._%-]+)@(?P<domain_name>(?P<host>(?:[A-Z0-9.-]+\\.)*)?(?P<sld>[A-Z0-9.-]+)\\.(?P<tld>[A-Z]{2,4})))\\b)\\h*)(?P<trailing_data>[^\\r\\n]*))$
(this is a group)?
(another group (with a group inside)) and soem bogus test (and then another group)
(?P<group_definition>
(?P<pattern>
\\(
(?:[^\\)\\(]*(?R)*)*
\\)
)
(?P<quantifier>
(?:[\\*\\+\\?])|
(?:
\\{(?P<min>\\d*)
(?:
,
(?P<max>\\d*)?
)?
\\}
)
)?
)';
my $regex = qr/(?P<group_definition>
\(
(?P<options>[^\:\>\s\(\)]*[\:\>])?
(?P<pattern>
(?:[^\)\(]*(?R)*)*
)
\)
(?P<quantifier>
(?:[\*\+\?])|
(?:
\{(?P<min>\d*)
(?:
,
(?P<max>\d*)?
)?
\}
)
)?
)/imxp;
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