const regex = /^(([a-zA-Z]{2}-?\d{2}-?\d{2})|(\d{2}-?\d{2}-?[a-zA-Z]{2})|(\d{2}-?[a-zA-Z]{2}-?\d{2})|([a-zA-Z]{2}-?\d{2}-?[a-zA-Z]{2})|([a-zA-Z]{2}-?[a-zA-Z]{2}-?\d{2})|(\d{2}-?[a-zA-Z]{2}-?[a-zA-Z]{2})|(\d{2}-?[a-zA-Z]{3}-?\d{1})|(\d{1}-?[a-zA-Z]{3}-?\d{2})|([a-zA-Z]{2}-?\d{3}-?[a-zA-Z]{1})|([a-zA-Z]{1}-?\d{3}-?[a-zA-Z]{2})|([a-zA-Z]{3}-?\d{2}-?[a-zA-Z]{1})|([a-zA-Z]{1}-?\d{2}-?[a-zA-Z]{3})|(\d{1}-?[a-zA-Z]{2}-?\d{3})|(\d{3}-?[a-zA-Z]{2}-?\d{1}))$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(([a-zA-Z]{2}-?\\d{2}-?\\d{2})|(\\d{2}-?\\d{2}-?[a-zA-Z]{2})|(\\d{2}-?[a-zA-Z]{2}-?\\d{2})|([a-zA-Z]{2}-?\\d{2}-?[a-zA-Z]{2})|([a-zA-Z]{2}-?[a-zA-Z]{2}-?\\d{2})|(\\d{2}-?[a-zA-Z]{2}-?[a-zA-Z]{2})|(\\d{2}-?[a-zA-Z]{3}-?\\d{1})|(\\d{1}-?[a-zA-Z]{3}-?\\d{2})|([a-zA-Z]{2}-?\\d{3}-?[a-zA-Z]{1})|([a-zA-Z]{1}-?\\d{3}-?[a-zA-Z]{2})|([a-zA-Z]{3}-?\\d{2}-?[a-zA-Z]{1})|([a-zA-Z]{1}-?\\d{2}-?[a-zA-Z]{3})|(\\d{1}-?[a-zA-Z]{2}-?\\d{3})|(\\d{3}-?[a-zA-Z]{2}-?\\d{1}))$', 'gm')
const str = `xx-99-99
99-99-xx
99-xx-99
xx-99-xx
xx-xx-99
99-xx-xx
99-xxx-9
9-xxx-99
xx-999-x
x-999-xx
xxx-99-x
x-99-xxx
9-xx-999
999-xx-9`;
// 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