use strict;
my $str = 'Peekaboo ; A comment starts with a semicolon and continues until the EOL
...unless the semicolon is surrounded by unescaped dquotes "Don’t do it ; here" ;but match me; once
Im not surrounded "so pay attention to me" ; "peekaboo"
Im not surrounded "so pay attention" to;me" ; "peekaboo"
Im not surrounded "so pay attention to me ; peekaboo
Dquote escapes a dquote so "dont pay attention to ""me;here"" buster" do it ; here
Don’t pay attention to """me;here""" but do ""it;here""
and "dont do ""it;here""" either ;peekaboo
but "pay attention to "it;here"" ;not here though
Simon said "I like goats" then he added "and sheep;" ;a good comment is "here
Simon said "I like goats" then he added "and sheep;" dont do it here
Simon said ""I like goats;"peekaboo
Simon said "I like goats;""peekaboo';
my $regex = qr/^(?>(?:""[^""\n]*""|[^;""\n]+)*)""?[^"";\n]*(;.*)/mp;
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