const regex = /([-\.\w]+:\/{2,3})(?!.*[.]{2})(?![-.*\.])((?!.*@\.)[-_\w@^=%&:;~+\.]+(?<![-\.]))(\/[-_\w@^=%&:;/~+\.]+(?<!\.))?\??([-_\w=&@$!|~+]+)*#?([-_\w=&@$!|~+]+)*/igum;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('([-\\.\\w]+:\\\/{2,3})(?!.*[.]{2})(?![-.*\\.])((?!.*@\\.)[-_\\w@^=%&:;~+\\.]+(?<![-\\.]))(\\\/[-_\\w@^=%&:;\/~+\\.]+(?<!\\.))?\\??([-_\\w=&@$!|~+]+)*#?([-_\\w=&@$!|~+]+)*', 'igum')
const 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
. , ; : ) ] }
`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
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 JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions