const regex = /(?:^|\n)(\d{4}(?:-\d{2}){2} (?:\d{2}:){2})\d{2}\.\d{3}( [+-]\d{2}:\d{2} )\[\d+\]( - Starting)[^\n]*(?:\n\1\d{2}\.\d{3}\2\[\d+\][^\n]*)*\n\1\d{2}\.\d{3}\2\[\d+\]\3[^\n]*/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?:^|\\n)(\\d{4}(?:-\\d{2}){2} (?:\\d{2}:){2})\\d{2}\\.\\d{3}( [+-]\\d{2}:\\d{2} )\\[\\d+\\]( - Starting)[^\\n]*(?:\\n\\1\\d{2}\\.\\d{3}\\2\\[\\d+\\][^\\n]*)*\\n\\1\\d{2}\\.\\d{3}\\2\\[\\d+\\]\\3[^\\n]*', 'gm')
const str = `2019-10-31 05:49:52.416 +10:00 [1] - Starting
2019-10-31 05:49:53.416 +10:00 [2] - not starting
2019-10-31 05:49:53.416 +10:00 [2] - Starting
2019-10-31 05:49:53.416 +10:00 [3] - Starting
2019-10-31 06:53:58.416 +10:00 [1] - Starting
2019-10-31 06:53:58.416 +10:00 [1] - Identical but not "starting"`;
// 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