const regex = /(?<=^|,|\w[ ])[ ]*\K(?!<[^.#])MY_STRING(?=[^.#])[ ]*(?=,|$)
|(?<=%)MY_STRING(?=%)|(?<=\()MY_STRING(?=\))
|(?:^|\w[ ]*)\KMY_STRING(?=[ ]*;comment)
|,[ ]*(%)?MY_STRING\1[^,]+;comment(*SKIP)(*FAIL)
|(^.*;video[ ]*$)(*SKIP)(*FAIL)/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?<=^|,|\\w[ ])[ ]*\\K(?!<[^.#])MY_STRING(?=[^.#])[ ]*(?=,|$)
|(?<=%)MY_STRING(?=%)|(?<=\\()MY_STRING(?=\\))
|(?:^|\\w[ ]*)\\KMY_STRING(?=[ ]*;comment)
|,[ ]*(%)?MY_STRING\\1[^,]+;comment(*SKIP)(*FAIL)
|(^.*;video[ ]*$)(*SKIP)(*FAIL)', 'gm')
const str = `[1]
text,MY_STRING ;comment
text,MY_STRING text ;comment
text,text MY_STRING text ;comment
--------------------------------------------------------------
-> dont catch any above because exist a
**comma** before #MY_STRING# and ;comment after.
--------------------------------------------------------------
[2]
text, MY_STRING , text ;comment
--------------------------------------------------------------
-> catch because exist a **comma** after #MY_STRING#
--------------------------------------------------------------
[3]
text, MY_STRING, MY_STRING ;comment
--------------------------------------------------------------
-> catch first #MY_STRING# but don't catch last #MY_STRING#
because she is between , and ;comment
--------------------------------------------------------------
[4]
MY_STRING
MY_STRING,text
text, MY_STRING,
MY_STRING ;comment
text MY_STRING ;comment
text,MY_STRING,text ;comment
%MY_STRING% , (MY_STRING)
--------------------------------------------------------------
-> catch all, because there's no [comma . #] preceding #MY_STRING#
and no [# ;comment ;video] succeeding
--------------------------------------------------------------
[5]
.MY_STRING
#MY_STRING
MY_STRING#
--------------------------------------------------------------
- > dont catch any
Independent of where MY_STRING is, either what it has between, don't catch any, because they have . or # preceding/proceeding the string.
--------------------------------------------------------------
[6]
MY_STRING, .MY_STRING, #MY_STRING, text, MY_STRING
text, MY_STRING#, MY_STRING, .MY_STRING
--------------------------------------------------------------
-> same as above, just catch MY_STRING samples not containing . #
--------------------------------------------------------------
[7]
text, MY_STRING ;video
MY_STRING ;video
#MY_STRING, MY_STRING, text, text MY_STRING ;video
--------------------------------------------------------------
- > In this case, the string will not be caught independent of where it is or what it has preceding/succeeding because exist the string ;video at the ending.
--------------------------------------------------------------
[8]
text,MY_STRING, text ;comment
^ ok catch (reason explained above)
--------------------------------------------------------------
[9]
text,MY_STRING@ text ;comment
-------------------------------------------------------------- ^ dont catch, because there's no comma after the string, and there's a comma before and ;comment after
--------------------------------------------------------------
[10]
MY_STRING,text,#MY_STRING,text,text,%MY_STRING% @ \$text #text <text> ;comment
^[1] ^[2] ^[3]
--------------------------------------------------------------
[1] catch
[2] don't (# preceding)
[3] don't catch, because there's a comma preceding, no comma succeding and at the end line exist the string ;comment
--------------------------------------------------------------
[11]
.MY_STRING,text,MY_STRING,text,text,%MY_STRING% @ \$text, #text <text> ;comment
^[1] ^[2] ^[3] ^[4]
--------------------------------------------------------------
[1] don't (dot preceding)
[2] catch
[3] catch because there's a comma on [4] so the string is not anymore between a comma preceding and ;comment succeeding, she is now between a comma preceding a comma succeeding and ;comment
[12]
.MY_STRING,text,MY_STRING,text,text,%MY_STRING% @ \$text #text <text> ;comment
^[1] ^[2] ^[3] ^[4]
--------------------------------------------------------------`;
// 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