2009-12-28 7 views
8

Ich habe nach Fragen wie diesem gesucht, aber alle Fälle, die ich gefunden habe, wurden in einer problemspezifischen Weise gelöst, wie mit! G in vi um die Regex-Übereinstimmungen zu negieren oder andere Dinge zu vergleichen, ohne eine Regex-Negation.Regex, um eine ganze Zeichenfolge nur zu vergleichen, wenn es einen gegebenen Teilstring/Suffix fehlt

So, ich bin interessiert an einer „reinen“ Lösung dieses Problems:

eine Reihe von Strings Mit Ich brauche sie mit einen regulären Ausdruck Matcher filtern, so dass es nur Blätter (matches) die Saiten fehlende Teilzeichenfolge Zum Beispiel Ausfiltern "Foo" in:

Boo 
Foo 
Bar 
FooBar 
BooFooBar 
Baz 

ergäbe in:

Boo 
Bar 
Baz 

versuchte ich es mit negativem Blick aheads/behinds (?!regex)/(?<!regex), Konstruktion, kann aber nicht herausfinden. Ist das überhaupt möglich?

+0

Hintergrund: phpunit hat --filter -Argument, das einen regulären Ausdruck für die Namen der eingeschlossenen Testfälle akzeptiert, aber kein exklusives Analog enthält. Das hat mich dazu gebracht, diese Frage zu stellen, die unabhängig von phpunit-Befehlszeilenargumenten interessant ist. –

Antwort

19

diesen regulären Ausdruck Versuchen:

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

Das wird ein Zeichen in einer Zeit und Test verbrauchen, wenn es voraus keine Foo ist. Das gleiche kann mit einem negativen Blick hinter erfolgen:

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

Sie können aber auch das Gleiche tun, ohne Umsehen Behauptungen:

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

Dies entspricht ein beliebiges Zeichen außer F oder ein F, auf die entweder kein o folgt, oder gefolgt von einem o nicht gefolgt von einem anderen o.

+1

ordentlich (15 Zeichen) –

+0

Was macht die 2? in^(? :(?! Foo).) * $ tun? – gameover

+0

Bekam es Teil von: (? gameover

Verwandte Themen