2009-12-28 20 views
8

He buscado preguntas como esta, pero todos los casos que encontré se resolvieron de una manera específica del problema, como usar! G en vi para anular las coincidencias de expresiones regulares, o hacer coincidir otras cosas, sin una negación de expresiones regulares.Regex para que coincida con una cadena completa solo si carece de una subcadena/sufijo dado

Por lo tanto, estoy interesado en una solución “pura” a esto:

Tener un conjunto de cadenas que necesito para filtrar con un coincidencias de expresión regular de modo que sólo las hojas (partidos) las cuerdas careciendo de una subcadena dada Por ejemplo, el filtrado de "Foo", en:

Boo 
Foo 
Bar 
FooBar 
BooFooBar 
Baz 

consecuencia:

Boo 
Bar 
Baz 

Intenté construir con aheads aspecto negativo/traseros (?!regex)/(?<!regex), pero no podía entenderlo. ¿Es eso posible?

+0

Antecedentes: phpunit tiene un argumento de filtro que acepta una expresión regular para los nombres de casos de prueba incluidos, pero no tiene un análogo excluyente. Eso es lo que me hizo hacer esta pregunta, que es interesante en sí misma, independientemente de los argumentos de la línea de comando phpunit. –

Respuesta

19

Pruebe esta expresión regular:

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

Esto consume un carácter a la vez y prueba si no hay Foo por delante. El mismo se puede hacer con una mirada detrás negativo:

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

Pero también se puede hacer lo mismo sin mirar a los lados afirmaciones:

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

Coincide con cualquier carácter excepto F o un F que no es seguido por un o o si es seguido por un o no seguido por otro o.

+1

limpio (15 caracteres) –

+0

¿Qué significa el 2do? en^(? :(?! Foo).) * $ do? – gameover

+0

Entendido como: (? gameover

Cuestiones relacionadas