8

I've searched for questions like this, but all the cases I found were solved in a problem-specific manner, like using !g in vi to negate the regex matches, or matching other things, without a regex negation.

Thus, I'm interested in a “pure” solution to this:

Having a set of strings I need to filter them with a regular expression matcher so that it only leaves (matches) the strings lacking a given substring. For example, filtering out "Foo" in:

Boo
Foo
Bar
FooBar
BooFooBar
Baz

Would result in:

Boo
Bar
Baz

I tried constructing it with negative look aheads/behinds (?!regex)/(?<!regex), but couldn't figure it out. Is that even possible?

Jason Williams
  • 56,972
  • 11
  • 108
  • 137
Ivan Krechetov
  • 18,802
  • 8
  • 49
  • 60
  • Background: phpunit has --filter argument which accepts a regular expression for included test cases' names, but doesn't have an excluding analog. That's what made me ask this question, which is interesting by itself, regardless of phpunit command line arguments. – Ivan Krechetov Dec 28 '09 at 10:21

1 Answers1

19

Try this regular expression:

^(?:(?!Foo).)*$

This will consume one character at a time and test if there is no Foo ahead. The same can be done with a negative look-behind:

^(?:.(?<!Foo))*$

But you can also do the same without look-around assertions:

^(?:[^F]*|F(?:$|[^o].|o(?:$|[^o])))*$

This matches any character except F or an F that is either not followed by a o or if followed by an o not followed by another o.

Gumbo
  • 643,351
  • 109
  • 780
  • 844