use strict;
my $str = 'DB_URL=postgresql://postgres:postgres@localhost/postgres?timeout=0
# Damn, Daniel!
Bob: have you checked https://www.facebook.com?
lorem https://github.com/justsml?tab=activity#top ipsum
smb:///winbox/dfs/ - ipp://printer
leading text chrome-extension://flags??#
s3://buckets/for/all?true=true
s3:///////buckets-o-fun
pkcs11://because-pkcs7-is-weak#only=hash
\\||@@https://www.google.com <- should match when extracting
https://we - this is valid
s3://buckets-o-fun/!hi/raw=val&#keep=hashin\'?
http://aaa.com.co.com:8080/test?dan=dev#den
hi. pkcs11://because-pkcs7-is-weak
hi. a://b/c?d=e#f=g && a://b/c?d]
hi. chrome-extension://flags hi.
hi. ms-help://good-luck/index.html hi.
hi. .iris.beep://really/dots. hi.
hi. iris.beep://really/dots?test=qs hi.
---
a://b]/c - Should match `a://b` - it\'s smallest match.
http://www.c:ool.com.au - this one\'s tricky, should match auth URIs: proto://user:pass@host. Including cases where the password could be omitted (`proto://user@host`.)
boop://really-/ -- technically domains shouldn\'t end in dashes or other \'special\' chars, but this is technically a valid URI.
---
a://b./c?d. -- bad dns, trailing dot: tricky w/o look-arounds. (Adding an OR pattern would muddle the returned data indexes.) -- should match `a://b`
Invalid Examples:
https://www...google...com
https://we@.com
https://asdas-.com
http://-apple-.com
a://(b/c
chrome-extension)://flags
ms-help://|good-luck.html
. , ; : ) ] }
';
my $regex = qr/([-\.\w]+:\/{2,3})(?!.*[.]{2})(?![-.*\.])((?!.*@\.)[-_\w@^=%&:;~+\.]+(?<![-\.]))(\/[-_\w@^=%&:;/~+\.]+(?<!\.))?\??([-_\w=&@$!|~+]+)*#?([-_\w=&@$!|~+]+)*/iump;
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