use strict;
my $str = 'CN= John Q. Public, O=Agency, C=US
CN= John Q. Public, Jr.,O=Agency, C=US
CN=John Q. Public,O=Agency, C=US
CN=John Q. Pu,blic,O=Agency, C=US
CN=some name,ou=Groups,ou=AAA,ou=DCCOMICS,o=boo berries,c=US
CN=some name, ou=Groups,ou=AAA,ou=DCCOMICS,o=boo berries,c=US
CN=some name-Y- , ou=Groups,ou=AAA,ou=DCCOMICS,o=boo berries,c=US
cn= some name-Y-,ou=Groups,ou=AAA,ou=DCCOMICS,o=boo berries,c=US
cn= some na, o me-Y-,ou=Groups,ou=AAA,ou=DCCOMICS,o=boo berries,c=US
(?<=^CN=) - positive lookahead to find string starts with CN= and discard that match
(.*?) - non greedy seach for any single character
(?=,\\s?ou\\s=|,\\s?o\\s?=)
(?=,\\s?ou\\s=|,\\s?o\\s?=)';
my $regex = qr/(?<=^CN=)(.*?)(?=\s?,\s?o)/mip;
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