const regex = new RegExp('^(?<tag>(?:[a-zA-Z]\\w*|_\\w+))(?<memspec>(?:(?:(?:\\s*\\.(?:[a-zA-Z]\\w*|_\\w+)|(?:\\s*\\[(?:[^,\\]]+)(?:,(?:[^,\\]]+))*\\]))*)(?:(?:\\s*\\.\\d+|\\.\\s*(?:\\s*\\[(?:[^,\\]]+)\\]))?)))?(?<metadataspec>(?:\\s*\\.\\@(?<metadataid>(?:[a-zA-Z]\\w*|_\\w+))(?<metadatamemspec>(?:(?:(?:\\s*\\.(?:[a-zA-Z]\\w*|_\\w+)|(?:\\s*\\[(?:[^,\\]]+)(?:,(?:[^,\\]]+))*\\]))*)(?:(?:\\s*\\.\\d+|\\.\\s*(?:\\s*\\[(?:[^,\\]]+)\\]))?)))?))?$', 'gm')
const str = `tag
tag.mem
tag.1
tag.[0]
tag[0]
tag[0].mem
tag[0].1
tag[0].[0]
tag.mem
tag.mem.mem
tag.mem.1
tag.mem.[0]
tag.mem[0]
tag.mem[0].mem
tag.mem[0].1
tag.mem[0].[0]
tag.@foo.mem[0].[0]
tag.mem.@foo.mem[0].[0]
tag.1.@foo.mem[0].[0]
tag.[0].@foo.mem[0].[0]
tag[0].@foo.mem[0].[0]
tag[0].mem.@foo.mem[0].[0]
tag[0].1.@foo.mem[0].[0]
tag[0].[0].@foo.mem[0].[0]
tag.mem.@foo.mem[0].[0]
tag.mem.mem.@foo.mem[0].[0]
tag.mem.1.@foo.mem[0].[0]
tag.mem.[0].@foo.mem[0].[0]
tag.mem[0].@foo.mem[0].[0]
tag.mem[0].mem.@foo.mem[0].[0]
tag.mem[0].1.@foo.mem[0].[0]
tag.mem[0].[0].@foo.mem[0].[0]
tag .mem [ tag.@foo ] .mem .@foo .mem [ 0 ] .a .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