const regex = /^ # begin of string
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 1th capturing group
(?:\brain\b|\bsunlight\b|\bbark) # Alternation group (answers) \b word-boundaries as needed
)
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 3th capturing group
(?:(?!(?:\1|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured in group 1 or 3
)
(?:(?!(?:\1|\2|\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 4th capturing group
(?:(?!(?:\2|\3))(?:\brain\b|\bsunlight\b|\bbark)) # Answers not captured by group 2 or 3
)
(?:(?!(?:\1|\2|\3)).)* # anything that is not captured by group 1,2,or 3
$ # end of string/gmi;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^ # begin of string
(?:(?!(?:\\1|\\2|\\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 1th capturing group
(?:\\brain\\b|\\bsunlight\\b|\\bbark) # Alternation group (answers) \\b word-boundaries as needed
)
(?:(?!(?:\\1|\\2|\\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 3th capturing group
(?:(?!(?:\\1|\\3))(?:\\brain\\b|\\bsunlight\\b|\\bbark)) # Answers not captured in group 1 or 3
)
(?:(?!(?:\\1|\\2|\\3)).)*? # ungreedy anything that is not captured by group 1,2,or 3
( # 4th capturing group
(?:(?!(?:\\2|\\3))(?:\\brain\\b|\\bsunlight\\b|\\bbark)) # Answers not captured by group 2 or 3
)
(?:(?!(?:\\1|\\2|\\3)).)* # anything that is not captured by group 1,2,or 3
$ # end of string', 'gmi')
const str = `rain. bright sunlight. a dog's bark.
rain. bright rain. a dog's bark.
Barksunlight rain
bark sun rain
bar sunlight sunlight
Rain rain rain
sunlight rain bark
Barking dog, sunlight, rainforest
Barking elephant, green Sunlight, purple rain and other non-sense
`;
// 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