With this example,
whether or not apple
apple
not apple
How could I find either apple
or not apple
and exclude whether or not apple
?
My attempt was to use negative lookbehind like
(?!whether or not)(([Nn]ot)?\s*apple)
but this finds all as
- whether or
not apple
apple
not apple
CodePudding user response:
As your consuming pattern starts with an optional pattern, you need to account for these two scenarios and implement two separate lookbehinds:
(?<!\bwhether or )(?<!\bwhether or not )(?:\bnot )?\bapple\b
See the regex demo. Details:
(?<!\bwhether or )
- nowhether or
allowed immediately on the left(?<!\bwhether or not )
- nowhether or not
allowed immediately on the left(?:\bnot )?
- an optional sequence ofnot
word and a space\bapple\b
- a whole wordapple
.
Another approach is to match the string you want to skip and skip it:
\bwhether\s or\s not\s apple\b(*SKIP)(*F)|(?:\bnot\s )?\bapple\b
See this regex demo. Here, \bwhether\s or\s not\s apple\b
matches the whether or not apple
and (*SKIP)(*F)
drop the match, skips to the position of the failure and restarts a new match search.
CodePudding user response:
The pattern you are looking for is ^(?:not\s)?apple
Python
import re
re.match(r"^(?:not\s)?apple", "apple") # matches
re.match(r"^(?:not\s)?apple", "not apple") # matches
re.match(r"^(?:not\s)?apple", "whether or not apple") # does not match
JavaScript
/^(?:not\s)?apple/.test("apple"); // matches
/^(?:not\s)?apple/.test("not apple"); // matches
/^(?:not\s)?apple/.test("whether or not apple"); // does not match