use strict;
my $str = '/^
(?=
(?=( [^{}()<>]* \\[+ [^{}()<>]* \\]+ [^{}()<>]* ))\\1 *$|
(?=( [^[\\]()<>]* \\{+ [^[\\]()<>]* \\}+ [^[\\]()<>]* ))\\2 *$|
(?=( [^[\\]{}<>]* \\(+ [^[\\]{}<>]* \\)+ [^[\\]{}<>]* ))\\3 *$|
(?=( [^[\\]{}()]* \\<+ [^[\\]{}()]* \\>+ [^[\\]{}()]* ))\\4 *$|
(?=( [^[\\]{}()<>]* ))\\5 *$
)
(?=
(?=( [^\\"]* \\“+ [^\\"]* \\”+ [^\\"]* ))\\6 *$|
(?=( [^“”]* \\"+ [^“”]* \\"+ [^“”]* ))\\7 *$|
(?=( [^\\"“”]* ))\\8 *$
)
(?=
(?=( [^\']* ‘+ [^\']* ’+ [^\']* ))\\9 *$|
(?=( [^‘’]* \'+ [^‘’]* \'+ [^‘’]* ))\\10 *$|
(?=( [^\'‘’]* ))\\11 *$
)
[A-Za-z0-9 \\"“”\'‘’()[\\]{}<>«»\\\\\\/?!&@£$€¥.,-]{3}
[A-Za-z0-9 \\"“”\'‘’()[\\]{}<>«»\\\\\\/?!&@£$€¥.,\\-*=#%+]{0,157}
$/';
my $regex = qr/^(?=(?=([^{}()<>]*\[+[^{}()<>]*\]+[^{}()<>]*))\1*$|(?=([^[\]()<>]*\{+[^[\]()<>]*\}+[^[\]()<>]*))\2*$|(?=([^[\]{}<>]*\(+[^[\]{}<>]*\)+[^[\]{}<>]*))\3*$|(?=([^[\]{}()]*\<+[^[\]{}()]*\>+[^[\]{}()]*))\4*$|(?=([^[\]{}()<>]*))\5*$)(?=(?=([^\"]*\“+[^\"]*\”+[^\"]*))\6*$|(?=([^“”]*\"+[^“”]*\"+[^“”]*))\7*$|(?=([^\"“”]*))\8*$)(?=(?=([^']*‘+[^']*’+[^']*))\9*$|(?=([^‘’]*'+[^‘’]*'+[^‘’]*))\10*$|(?=([^'‘’]*))\11*$)[A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,-]{3}[A-Za-z0-9 \"“”'‘’()[\]{}<>«»\\\/?!&@£$€¥.,\-*=#%+]{0,157}$/p;
if ( $str =~ /$regex/ ) {
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