const regex = /LIST\d+ LIST\d+\R((?!$)\S*(?: +\S+)?(?:\R|\Z))*?(?:(?:(\S+) +(?:\S*\R(?1)*\S* +)?\2\b\R?)|(?:\S+ (\S+)\R(?1)*\3\b))(?1)*/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('LIST\\d+ LIST\\d+\\R((?!$)\\S*(?: +\\S+)?(?:\\R|\\Z))*?(?:(?:(\\S+) +(?:\\S*\\R(?1)*\\S* +)?\\2\\b\\R?)|(?:\\S+ (\\S+)\\R(?1)*\\3\\b))(?1)*', 'gm')
const str = `LIST1 LIST2
item1 item2
item3 item4
item5 item6
LIST3 LIST4
item1 item2
item4
item2
LIST5 LIST6
item1 item3
item2 item4
item5 item2
LIST7 LIST8
item1 itemA
item2 itemB
item3 itemC
itemD
item3
itemE`;
// 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