use strict;
my $str = '|(?:\\\\|\\/
[my label 1]: /foo/bar.jpg "My title, optional"
[my label 2]: ~/foo/bar.png "My title, optional"
[my label 1]: ~/foo/.img "My title, optional"
[my label 1]: ~/.img "My title, optional"
[my label 2]: /foo
[my label 3]: https://fsf.org (The free software foundation)
[my label 3]: (The free software foundation)
[my label 4]: /bar#special \'A title in single quotes\'
[my label 1]: ./foo/bar.html "My title, optional"
[my label 2]: ../foo/bar.html
[my label 1]: ./foo/bar.html "My title, optional"
[my label 3]: https://fsf.org (The free software foundation)
[my label 4]: /foo/bar.html#special \'A title in single quotes\'
[my label 5]: <http://foo.bar.baz>
[my label 3]: https://fsf.org
"The free software foundation"
[my label 5]: <http://foo.bar.baz>
[my label 1]: ..\\foo\\bar.html "My title, optional"
[my label 1]: C:\\foo\\bar.html "My title, optional"
[my label 1]: .\\foo\\bar.html "My title, optional"
[my label 1]: \\\\unc.server.tld.co\\path\\to\\file.ext "My title, optional"
[my label 2]: C:\\foo
[my label 3]: https://fsf.org (The free software foundation)
[my label 2]: /foo
[my label 3]: https://fsf.org (The free software foundation)
(?:\\.{1,2}|~){0,1}(?:(?:\\/|\\\\)(?:[a-zA-Z0-9._ -])*)+
^\\[(?!\\^)(.*)\\]: <?((?:[a-zA-Z]\\:|\\\\\\\\[^\\/\\\\:*?"<>|]+\\\\[^\\/\\\\:*?"<>|]+|\\.{1,2})(?:\\\\[^\\/\\\\:*?"<>|]+)+(?:\\.[^\\/\\\\:*?"<>| ]+)|(?:\\.{1,2}|~){0,1}(?:(?:\\/|\\\\)(?:[a-zA-Z0-9._ -])*)+|\\w+:(?:\\/?\\/?)[^\\s]+)>?(?:\\n? +["\'(](.*)["\')])?(?: \\{(.*)\\})?';
my $regex = qr/^\[(?!\^)(.*)\]: <?((?:[a-zA-Z]\:|\\\\[^\/\\:*?"<>|]+\\[^\/\\:*?"<>|]+|\.{1,2})(?:\\[^\/\\:*?"<>|]+)+(?:\.[^\/\\:*?"<>| ]+)|(?:\.{1,2}|~){0,1}(?:(?:\/|\\)(?:[a-zA-Z0-9._-])*)+|\w+:(?:\/?\/?)[^\s>]+)>?(?:\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