const regex = /^\s*((((([0-9A-Fa-f]{1,4})|\*):){7}((([0-9A-Fa-f]{1,4})|\*)|:))|(((([0-9A-Fa-f]{1,4})|\*):){6}(:(([0-9A-Fa-f]{1,4})|\*)|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(((([0-9A-Fa-f]{1,4})|\*):){5}(((:(([0-9A-Fa-f]{1,4})|\*)){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(((([0-9A-Fa-f]{1,4})|\*):){4}(((:(([0-9A-Fa-f]{1,4})|\*)){1,3})|((:(([0-9A-Fa-f]{1,4})|\*))?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|\*):){3}(((:(([0-9A-Fa-f]{1,4})|\*)){1,4})|((:(([0-9A-Fa-f]{1,4})|\*)){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|\*):){2}(((:(([0-9A-Fa-f]{1,4})|\*)){1,5})|((:(([0-9A-Fa-f]{1,4})|\*)){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|\*):){1}(((:(([0-9A-Fa-f]{1,4})|\*)){1,6})|((:(([0-9A-Fa-f]{1,4})|\*)){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:(([0-9A-Fa-f]{1,4})|\*)){1,7})|((:(([0-9A-Fa-f]{1,4})|\*)){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))\s*$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^\\s*((((([0-9A-Fa-f]{1,4})|\\*):){7}((([0-9A-Fa-f]{1,4})|\\*)|:))|(((([0-9A-Fa-f]{1,4})|\\*):){6}(:(([0-9A-Fa-f]{1,4})|\\*)|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(((([0-9A-Fa-f]{1,4})|\\*):){5}(((:(([0-9A-Fa-f]{1,4})|\\*)){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(((([0-9A-Fa-f]{1,4})|\\*):){4}(((:(([0-9A-Fa-f]{1,4})|\\*)){1,3})|((:(([0-9A-Fa-f]{1,4})|\\*))?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|\\*):){3}(((:(([0-9A-Fa-f]{1,4})|\\*)){1,4})|((:(([0-9A-Fa-f]{1,4})|\\*)){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|\\*):){2}(((:(([0-9A-Fa-f]{1,4})|\\*)){1,5})|((:(([0-9A-Fa-f]{1,4})|\\*)){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(((([0-9A-Fa-f]{1,4})|\\*):){1}(((:(([0-9A-Fa-f]{1,4})|\\*)){1,6})|((:(([0-9A-Fa-f]{1,4})|\\*)){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:(([0-9A-Fa-f]{1,4})|\\*)){1,7})|((:(([0-9A-Fa-f]{1,4})|\\*)){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))\\s*$', 'gm')
const str = `2404:6800:4003:c02::8a
2404:6800:4003:804::200e
2001:4998:c:a06::2:4008
fe80::21d8:f50:c295:c4be
2001:cdba::e:9652
2001:cdba:0:0:0:0:3257:9652
2001:cdba::3257:9652
2001:cdba::1222
21DA:D3:0:2F3B:2AA:FF:FE28:9C5A
2001:cdba::1:2:3:3257:9652
2404::4003:804::200e
1234:Fd2:2:1:89::4500
1234:Fd2:12:1:89::4500
2001:DB8:0:0:0:0:0:*
2001:DB8:0:0:0:*:*:*
2001:DB8::0:*
2001:DB8:0:0:0:*:0:1
::
2001:DB8:0:0:0:*
2001:*:1
*
`;
// 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