const regex = /^.*?((?:\s+\d+\.\s+Nx?[a-h][1-8]\s+[RBKQN]?x?[a-h][1-8]){2,}).*$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^.*?((?:\\s+\\d+\\.\\s+Nx?[a-h][1-8]\\s+[RBKQN]?x?[a-h][1-8]){2,}).*$', 'gm')
const str = `[Event "Live Chess"] [Site "Chess.com"] [Date "2023.02.17"] [Round "-"] [White "-"] [Black "-"] [Result "1-0"] [WhiteElo "925"] [BlackElo "939"] [TimeControl "180+2"] [EndTime "17:39:13 PST"] [Termination "- won by checkmate"]
e4 e5 2. Nc3 d6 3. Bc4 h6 4. d3 Nc6 5. f4 Qe7 6. Nf3 Be6 7. f5 Bxc4 8. dxc4 O-O-O 9. b3 Nf6 10. O-O g5 11. fxg6 fxg6 12. Nh4 g5 13. Ng6 Qg7 14. Nxh8 Qxh8 15. Nd5 Nxd5 16. exd5 Nd4 17. c3 Nxb3 18. axb3 a6 19. b4 Be7 20. Qg4+ Kb8 21. b5 axb5 22. cxb5 b6 23. Qa4 Kc8 24. Qa8+ Kd7 25. Qc6+ Kc8 26. Ra8# 1-0
[Event "Live Chess"] [Site "Chess.com"] [Date "2023.02.17"] [Round "-"] [White "-"] [Black "-"] [Result "1-0"] [WhiteElo "914"] [BlackElo "841"] [TimeControl "180+2"] [EndTime "19:06:57 PST"] [Termination "- won by resignation"]
e4 e5 2. Nc3 Nc6 3. Bc4 Nf6 4. d3 Bc5 5. Na4 Bb4+ 6. c3 Be7 7. f4 b5 8. Bxb5 a6 9. Bc4 O-O 10. f5 d5 11. exd5 Nxd5 12. Nf3 Bxf5 13. O-O Bc5+ 14. Nxc5 Nf4 15. Nxe5 Nxe5 16. Rxf4 Bg4 17. Rxg4 Nxg4 18. Qxg4 Re8 19. Bh6 g6 1-0`;
// 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