I wrote this regex: (?<![.#])bMY_STRINGb(?![#])(?!.*(;video))
With the intention to search for a string not containing .
or #
preceding it, and no #
succeeding, it also checks if at the ending does not contain the word ;video
.
I’m trying now in how I could also check for if between the found string exist a comma
before it, and the text ;comment
after it, if so then don’t catch this string.
Examples:
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.
text, MY_STRING , text ;comment
-> catch because exist a **comma** after MY_STRING (explanation at the bottom of thread)
text, MY_STRING, MY_STRING ;comment
-> catch first MY_STRING but don't catch last MY_STRING
because she is between , and ;comment
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 because there's no [comma . #] preceding MY_STRING
and no [# ;comment ;video] succeeding
.MY_STRING
#MY_STRING
MY_STRING#
- > Independent of where MY_STRING is, either what it has between, don't catch any, because they have . or # preceding/proceeding the string.
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 . #
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.
MY_STRING
^ in the end line could exist only one of those: ;comment or ;video and not both at same time.
The needle regex must obey the things I’m trying to catch as described at the beginning of the thread.
Edit: added more samples on the examples above, also:
Q- Why should there be a match in text,MY_STRING,text ;comment? The MY_STRING is preceded with, and is followed with ;comment some chars after.
Because there’s a comma after the string, in this case, she can be caught, but if it was any other special char the don’t, example:
text,MY_STRING, text ;comment
^ ok catch (reason explained above)
text,MY_STRING@ text ;comment
^ dont catch, because there's no comma after the string, and there's a comma before and ;comment after
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
.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
Added the examples here: https://regex101.com/r/himCtG/2/
Guys, I know its confusing, I spent hours trying my best to make it clearer, please don’t negative my question, I really need/appreciate any help on it, if there’s something unclearer tag me and I’m asap will answer.
Advertisement
Answer
Your description is not entirely clear but I think I got the idea; how about this:
(?:^MY_STRING)|(?<=,) *MY_STRING(?= *,)|(?<=[^, ]) *MY_STRING(?= *[^,](?:;(?:comment|video)))
With the updated samples I came up with this pattern that seems to cover all cases; though I still feel not all possible permutations are covered:
(?<=^|,|w[ ])[ ]*K(?!<[^.#])MY_STRING(?=[^.#])[ ]*(?=,|$)
|(?<=%)MY_STRING(?=%)|(?<=()MY_STRING(?=))
|(?:^|w[ ]*)KMY_STRING(?=[ ]*;comment)
|,[ ]*(%)?MY_STRING1[^,]+;comment(*SKIP)(*FAIL)
|(^.*;video[ ]*$)(*SKIP)(*FAIL)