use strict;
my $str = 'ABCD
ABCDE
snake_case
camelCase
2PascalCase
streamIOIO
gREATERDtha
MdeADFAFdsADFads
DeviceSNSD
AabcABCD
AabcABCDabcABCD
ABabcABCD
ABabcABCDabcABCD
ABCabcABCD
ABCabcABCDabcABCDabcABCDabcABCD
ABCDabcABCD
ABCDabcABCDabcABCDabcABCDabcABCD
HTMLParser
ContextHTMLParser
ABabcABCDbcABC
ABCDabcABC
ABCDabcAB
ABCDabcA
CamelCa_1
HELLO
AaABC
PacalCasePacalCasePacalCasePacalCasePacalCasePacalCase
AabcABCabcABC
MoeADFdsADFads
ABCabcABC
ABCabcAB
ABabcABC
ABabcAB
AabcAB
ABCabcABCabcA
ABCabcA
Aabc123
AabcABC
A
AB
ABC
StreamIO
IOStream
DeviceID
DeviceSNS
Context
PascalCase
Pascal2Case
PascalCaseA
Pascal2CaseA
ModeA
Mode2A
Mode2A2
Mode2A2A
CreateAMode
CreateBMode
MadeEasy
WonderFul
AndMe
HtmlParser
H
AaA
Camel01C
Camel01c01
Camel01C01
Camel01CC01
Camel0a1c1
Camel0a1C1
Camel0ac1b1C1
CamelC
CamelC1
CamelCA
CamelCa1
IbsReleaseTestVerificationRegressionSuite
IbsReleaseTestVerificationRegressioNSuite
IbsReleaseTestVerificationRegressioN
XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D';
my $regex = qr/^[A-Z](([A-Z]{1,2}[a-z0-9]+)+([A-Z]{1,3}[a-z0-9]+)*[A-Z]{0,3}|([a-z0-9]+[A-Z]{0,3})*|[A-Z]{1,2})$/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