2009-12-28 39 views
8

我已經搜索過這樣的問題,但是我發現所有的情況都是以特定於問題的方式解決的,就像在vi中使用!g否定正則表達式匹配或匹配其他事物,而不用正則表達式否定。正則表達式匹配整個字符串只有當它缺少給定的子字符串/後綴

因此,我感興趣的是一個「純」解決了這個:

具有一組字符串我需要與正則表達式匹配進行篩選,使其只長葉子(匹配)的字符串缺少給定的子字符串。例如,過濾出 「富」 在:

Boo 
Foo 
Bar 
FooBar 
BooFooBar 
Baz 

會導致:

Boo 
Bar 
Baz 

我試圖用消極的外觀aheads /屁股(?!regex)/(?<!regex)建造它,但無法弄清楚。這甚至有可能嗎?

+0

背景:phpunit具有--filter參數,它接受包含測試用例的名稱的正則表達式,但沒有排除模擬。這就是讓我問這個問題,無論phpunit命令行參數如何,這本身都很有趣。 – 2009-12-28 10:21:33

回答

19

試試這個正則表達式:

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

這將消耗一次一個字符和測試,如果沒有領先。這也可以用負向後看來完成:

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

但你也可以不環視斷言做同樣的:

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

此匹配任何字符除了˚FF,其後面跟着或者如果後面跟着或者,則不跟着另一個或者

+1

整齊(15個字符) – 2009-12-28 10:20:39

+0

第二個是什麼?在^(?:(?!Foo)。)* $ do? – gameover 2009-12-28 10:33:47

+0

瞭解它的一部分:(?<!pattern),+1 – gameover 2009-12-28 10:37:59

相關問題