const regex = /(?<FULLREQUEST>^(?<HOST>(?<PROTOCOL>(?:http)?s?:?\/\/)(?<DOMAIN>[^\/]+\/)|(?<RELATIVE>(?:\.*\/?)+))(?<PATH>[^\s]+\/)?(?<FILENAME>(?:(?<NAME>[^\/\s\.\?\#]+?)?(?<EXT>\.[^\s\?\#]*)?|(?:\/[^\/\s\?\#]+?)))(?<QUERYSTRING>\?[^\s\#]+)?(?<ANCHOR>\#\S+)?$)/gim;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?<FULLREQUEST>^(?<HOST>(?<PROTOCOL>(?:http)?s?:?\\\/\\\/)(?<DOMAIN>[^\\\/]+\\\/)|(?<RELATIVE>(?:\\.*\\\/?)+))(?<PATH>[^\\s]+\\\/)?(?<FILENAME>(?:(?<NAME>[^\\\/\\s\\.\\?\\#]+?)?(?<EXT>\\.[^\\s\\?\\#]*)?|(?:\\\/[^\\\/\\s\\?\\#]+?)))(?<QUERYSTRING>\\?[^\\s\\#]+)?(?<ANCHOR>\\#\\S+)?$)', 'gim')
const str = `Domain Name Root
https://www.domain.com/
https://www.domain.com/?with=queryString
https://www.domain.com/#withAnchor
https://www.domain.com/?with=queryString#andAnchor
Full Domain Name With File
https://www.domain.com/with-file
https://www.domain.com/with-file?with=queryString
https://www.domain.com/with-file#withAnchor
https://www.domain.com/with-file?with=queryString#andAnchor
Full Domain Name With File With Extension
https://www.domain.com/file-with.ext
https://www.domain.com/file-with.ext?with=queryString
https://www.domain.com/file-with.ext#withAnchor
https://www.domain.com/file-with.ext?with=queryString#andAnchor
Full Domain Name With Path to File
https://www.domain.com/some-path/to/a/file
https://www.domain.com/some-path/to/a/file?with=queryString
https://www.domain.com/some-path/to/a/file#withAnchor
https://www.domain.com/some-path/to/a/file?with=queryString#andAnchor
Full Domain Name With Path to File With Extension
https://www.domain.com/some-path/to/a/file-with.ext
https://www.domain.com/some-path/to/a/file-with.ext?with=queryString
https://www.domain.com/some-path/to/a/file-with.ext
https://www.domain.com/some-path/to/a/file-with.ext?with=queryString#andAnchor
Dynamic Protocol Full Domain
//www.domain.com/
//www.domain.com/?with=queryString
//www.domain.com/#withAnchor
//www.domain.com/?with=queryString#andAnchor
Dynamic Protocol (Full Domain) to File
//www.domain.com/with-file
//www.domain.com/with-file?with=queryString
//www.domain.com/with-file#withAnchor
//www.domain.com/with-file?with=queryString#andAnchor
Dynamic Protocol (Full Domain) to File With Extension
//www.domain.com/with-file-with.ext
//www.domain.com/with-file-with.ext?with=queryString
//www.domain.com/with-file-with.ext#withAnchor
//www.domain.com/with-file-with.ext?with=queryString#andAnchor
Dynamic Protocol (Full Domain), Path Leading to File
//www.domain.com/with/path/to/file
//www.domain.com/with/path/to/file?with=queryString
//www.domain.com/with/path/to/file#withAnchor
//www.domain.com/with/path/to/file?with=queryString#andAnchor
Dynamic Protocol (Full Domain), Path Leading to File With Extension
//www.domain.com/with/path/to/file-with.ext
//www.domain.com/with/path/to/file-with.ext?with=queryString
//www.domain.com/with/path/to/file-with.ext#withAnchor
//www.domain.com/with/path/to/file-with.ext?with=queryString#andAnchor
Root Relative File
/some-root-file
/some-root-file?with=queryString
/some-root-file#withAnchor
/some-root-file?with=queryString#andAnchor
Root Relative File With Extension
/root-file-with.ext
/root-file-with.ext?with=queryString
/root-file-with.ext#withAnchor
/root-file-with.ext?with=queryString#andAnchor
Root Path to File
/some-root-path/to/a/file
/some-root-path/to/a/file?with=queryString
/some-root-path/to/a/file#withAnchor
/some-root-path/to/a/file?with=queryString#andAnchor
Root Path to File With Extension
/some-root-path/to/a/file-with.ext
/some-root-path/to/a/file-with.ext?with=queryString
/some-root-path/to/a/file-with.ext#withAnchor
/some-root-path/to/a/file-with.ext?with=queryString#andAnchor
Relative (Same As Requestor) File
./relative-to-requester-file
./relative-to-requester-file?with=queryString
./relative-to-requester-file#withAnchor
./relative-to-requester-file?with=queryString#andAnchor
Relative (Same As Requestor) File With Extension
./relative-to-requester-file-with.ext
./relative-to-requester-file-with.ext?with=queryString
./relative-to-requester-file-with.ext#withAnchor
./relative-to-requester-file-with.ext?with=queryString#andAnchor
Relative (Same As Requestor) Path To File
./relative-to-requester-path/to/a/file
./relative-to-requester-path/to/a/file?with=queryString
./relative-to-requester-path/to/a/file#withAnchor
./relative-to-requester-path/to/a/file?with=queryString#andAnchor
Relative (Same As Requestor) Path To File With Extension
./relative-to-requester-path/to/a/file-with.ext
./relative-to-requester-path/to/a/file-with.ext?with=queryString
./relative-to-requester-path/to/a/file-with.ext#withAnchor
./relative-to-requester-path/to/a/file-with.ext?with=queryString#andAnchor
Relative (Above Requestor) File
../relative-file-up
../relative-file-up?with=queryString
../relative-file-up#withAnchor
../relative-file-up?with=queryString#andAnchor
Relative (Above Requestor) File With Extension
../relative-file-up-with.ext
../relative-file-up-with.ext?with=queryString
../relative-file-up-with.ext#withAnchor
../relative-file-up-with.ext?with=queryString#andAnchor
Relative (two Above Requestor) File
../../relative-file-two-up
../../relative-file-two-up?with=queryString
../../relative-file-two-up#withAnchor
../../relative-file-two-up?with=queryString#andAnchor
Relative (two Above Requestor) File With Extension
../../relative-file-two-up.ext
../../relative-file-two-up.ext?with=queryString
../../relative-file-two-up.ext#withAnchor
../../relative-file-two-up.ext?with=queryString#andAnchor
Relative (n Above Requestor) File
../../../../../../../../relative-file-n-up
../../../../../../../../relative-file-n-up?with=queryString
../../../../../../../../relative-file-n-up#withAnchor
../../../../../../../../relative-file-n-up?with=queryString#andAnchor
Relative Path (Above Requestor) to File
../relative-path/up/to/a/file
../relative-path/up/to/a/file?with=queryString
../relative-path/up/to/a/file#withAnchor
../relative-path/up/to/a/file?with=queryString#andAnchor
Relative Path (Above Requestor) to File With Extension
../relative-path/up/to/a/file-with.ext
../relative-path/up/to/a/file-with.ext?with=queryString
../relative-path/up/to/a/file-with.ext#withAnchor
../relative-path/up/to/a/file-with.ext?with=queryString#andAnchor
Relative Path (Two Above Requestor) to File
../../relative-path/two/up/to/a/file
../../relative-path/two/up/to/a/file?with=queryString
../../relative-path/two/up/to/a/file#withAnchor
../../relative-path/two/up/to/a/file?with=queryString#andAnchor
Relative Path (Two Above Requestor) to File With Extension
../../relative-path/two/up/to/a/file-with.ext
../../relative-path/two/up/to/a/file-with.ext?with=queryString
../../relative-path/two/up/to/a/file-with.ext#withAnchor
../../relative-path/two/up/to/a/file-with.ext?with=queryString#andAnchor
Relative Path (n Above Requestor) to File
../../../../../relative-path/n/up/to/a/file
../../../../../relative-path/n/up/to/a/file?with=queryString
../../../../../relative-path/n/up/to/a/file#withAnchor
../../../../../relative-path/n/up/to/a/file?with=queryString#andAnchor
Relative Path (n Above Requestor) to File With Extension
../../../../../relative-path/n/up/to/a/file-with.ext
../../../../../relative-path/n/up/to/a/file-with.ext?with=queryString
../../../../../relative-path/n/up/to/a/file-with.ext#withAnchor
../../../../../relative-path/n/up/to/a/file-with.ext?with=queryString#andAnchor
`;
// 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