Reputation: 171
I'm quite new to regular expression, and have been searching around for away to do this without success. Given a string, I want to remove any pattern that starts with "abc", ends with "abc", and does not contain "abc" in the middle. If I do
'abc.*(abc).*abc'
it will match any patter starts with "abc", ends with "abc", and does contain "abc" in the middle. How do I do the opposite. I try
'abc.*^(abc).*abc'
but it won't work.
Upvotes: 3
Views: 12374
Reputation: 70722
Your syntax for trying to negate part of your pattern is incorrect.
Also, ^
outside of a character class asserts position at the beginning of the string. You need to use a Negative Lookahead assertion and be sure to anchor the entire pattern.
^abc(?:(?!abc).)*abc$
Upvotes: 8
Reputation: 107287
You can try the following pattern :
^abc((?!abc).)*abc$
(?!abc)
is Negative Lookahead - Assert that it is impossible to match the abc
inside your string.
Upvotes: 8