const regex = /^(?!^xn--.*)(?!^.*(\.s3alias|--ol-s3)$)(?!^([0-9]+\.){3}[0-9]+$)(?!.*\.\.+)(^[a-z0-9][a-z0-9\-\.]{1,61}[a-z0-9]$)$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?!^xn--.*)(?!^.*(\\.s3alias|--ol-s3)$)(?!^([0-9]+\\.){3}[0-9]+$)(?!.*\\.\\.+)(^[a-z0-9][a-z0-9\\-\\.]{1,61}[a-z0-9]$)$', 'gm')
const str = `// ^(?!^xn--.*)(?!^.*(\\.s3alias|--ol-s3)\$)(?!^([0-9]+\\.){3}[0-9]+\$)(?!.*\\.\\.+)(^[a-z0-9][a-z0-9\\-\\.]{1,61}[a-z0-9]\$)\$
// 1. Disallow the xn-- .s3alias and --ol-s3 bans:
// (?!^xn--.*)(?!^.*(\\.s3alias|--ol-s3)\$)
// 2. Disallow IPv4 address (four segments of 1-3 numbers, separated by dots)
// (?!^([0-9]{1,3}\\.){3}[0-9]{1,3}\$)
// 4. Disallow consecutive dots
// (?!.*\\.\\.+)
// 3. must be 3-63 characters, starting and ending with alphanum, and only dots, dashes or lower alphanum
// (^[a-z0-9][a-z0-9\\-\\.]{1,61}[a-z0-9]\$)
//
// Shorter version of this:
// ^(?!(xn--.*|.*(\\.s3alias|--ol-s3)\$|([0-9]+\\.){3}[0-9]+\$|.*\\.\\.+))(^[a-z0-9][a-z0-9\\-\\.]{1,61}[a-z0-9]\$)
//
// Alternative:
// ^(?!^xn--.*)(?!^.*(\\.s3alias|--ol-s3)\$)(?!^([0-9]+\\.){3}[0-9]+\$)^[a-z0-9](\\.[a-z0-9\\-]+|[a-z0-9\\-])*(\\.|[a-z0-9\\-])[a-z0-9]\$
// 1. Disallow the xn-- .s3alias and --ol-s3 bans:
// (?!^xn--.*)(?!^.*(\\.s3alias|--ol-s3)\$)
// 2. Disallow IPv4 address (four segments of 1-3 numbers, separated by dots)
// (?!^([0-9]{1,3}\\.){3}[0-9]{1,3}\$)
// 3. Must start with alphanum
// ^[a-z0-9]
// 4. Allow only dots, dashes or lower alphanum, and disallow consecutive dots:
// (\\.[a-z0-9\\-]+|[a-z0-9\\-])*
// 5. Must be three or more chars and end in an alphanum:
// (\\.|[a-z0-9\\-])[a-z0-9]\$
//
// fine
a.b.c
asdf
a.b
abc
a-b
a--b
a---------------------b
000
010
1.2.3.a
foo-s3alias
foo--ol-s
xn-a
// too short
a
ab
// no int'l idn looking
xn--asdf
// can't end in these
foo.s3alias
foo--ol-s3
// must start, end in alphanum
abcd.
.abcd
.ab
abc-
acb.b-
// no consecutive dots
a....c
a..c
aaaa.a.a..b
// non-alphanumdash
élan
hello_world
FOO
foO
`;
// 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