2009-12-28 11 views
8

Ho cercato domande come questa, ma tutti i casi che ho trovato sono stati risolti in un modo specifico del problema, ad esempio usando! G in vi per annullare le corrispondenze regolari, o corrispondenti ad altre cose, senza una negazione delle espressioni regolari.Regex per abbinare un'intera stringa solo se manca una sottostringa/suffisso data

Così, io sono interessato a una soluzione “puro” a questo:

Avere un insieme di stringhe che ho bisogno di filtrarli con un'espressione regolare matcher in modo che solo le foglie (partite) le stringhe manca una sottostringa data. Ad esempio, filtrando "Pippo" a:

Boo 
Foo 
Bar 
FooBar 
BooFooBar 
Baz 

comporterebbe:

Boo 
Bar 
Baz 

ho provato costruirlo con aheads sguardo negative/behinds (?!regex)/(?<!regex), ma non riuscivo a capire. È possibile?

+0

Sfondo: phpunit ha l'argomento --filter che accetta un'espressione regolare per i nomi dei casi di test inclusi, ma non ha un analogo escluso. Questo è ciò che mi ha fatto fare questa domanda, che è interessante da sola, indipendentemente dagli argomenti della riga di comando phpunit. –

risposta

19

Prova questa espressione regolare:

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

Questo consumerà un carattere alla volta e verificare se non v'è alcuna Foo avanti. Lo stesso può essere fatto con un look-dietro negativo:

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

ma anche si può fare lo stesso senza sguardo-around asserzioni:

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

Questo corrisponde a qualsiasi carattere eccetto F o un F che è o no con un o o se seguito da un o non seguita da un'altra o.

+1

neat (15 caratteri) –

+0

Che cosa significa il 2 °? in^(? :(?! Foo).) * $ do? – gameover

+0

Ottenuto la sua parte di: (? gameover