use strict;
my $str = '# OK - Matches all components if all are provided
contextClassName:pc_ruleName(param_One paramTwo)!:pc::pe@media
# OK - Return group 2 blank when no : exists before _ which is group 3
contextClassName_ruleName(param_One paramTwo)!:pc::pe@media
# OK - When ! is not provided return group 6 blank
contextClassName_ruleName(param_One paramTwo):pc::pe@media
# NOTOK - More than one consecutive !
contextClassName_ruleName(param_One paramTwo)!!:pc::pe@media
# NOTOK - 3 More than two : at instruction tail
contextClassName_ruleName(param_One paramTwo):::pe@media
# OK - 2 At instruction tail :: is resolved to group 8
contextClassName_ruleName(param_One paramTwo)::pe@media
# OK - 1 At instruction tail : is resolved to group 7
contextClassName_ruleName(param_One paramTwo):pe@media
# OK - At instruction start : followed by chars
contextClassName:pc_ruleName(param_One paramTwo):pe@media
# NOTOK - At instruction start : not followed by chars
contextClassName:_ruleName(param_One paramTwo):pe@media
# NOTOK - At instruction start :: followed by chars
contextClassName::pc_ruleName(param_One paramTwo):pe@media
# OK - Whole instruction tail is optional
contextClassName:pc_ruleName(param_One paramTwo)
# OK - Parameter value can contain anything
contextClassName:pc_ruleName(param_One param#$^Two)';
my $regex = qr/^#start of line
(?![^\n!]*!{2,})
(?=[^_\n]*_[^_]*) #if _ exists, then:
([^_:]+) #mandatory group 1
((?=:[^:\n]):[^:_(\n]+|) #optional group 2
(_(?!_)) #group 3 mandatory
([^_\-(\n]+) # group 4 mandatory
\( #mandatory (
([^()\n]+) # group 5 mandatory
\) #mandatory )
((?=!)!|) # group 6 optional
((?=:[^!:@\n]):[^!:@\n]+|) # group 7 optional
((?=::[^!:@\n])::[^!:@\n]+|) #group 8 optional
((?=@[^!:@\n])@[^!:@\n]+|) #group 9 optional
$ #end of line/mxp;
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