2009-06-05 9 views
23

Con PCRE, ¿cómo se puede construir una expresión que solo coincidirá si se encuentra una cadena no.Invertir coincidencia con regexp

Si estuviera usando grep (que no soy) me gustaría la opción -v.

Un ejemplo más concreto: Quiero mi expresión regular para que coincida con la cadena si y sólo si es foono en la cadena. Por lo tanto, coincidiría con bar, pero no con foobar.

+0

¿Qué idioma está utilizando? – innaM

+0

Esto se ingresa en un servicio web que anuncia PCRE. Entonces, el lenguaje es PCRE, realmente. –

+1

Duplicado: http://stackoverflow.com/questions/850907/regular-expression-opposite –

Respuesta

41

Bien, he perfeccionado mi expresión regular en función de la solución que se te ocurrió (que erróneamente coincide con las cadenas que comienzan con 'prueba').

^((?!foo).)*$ 

Esta expresión regular coincidirá solo con cadenas que no contengan foo. La primera búsqueda anticipada negará las cadenas que comiencen con 'foo', y la segunda se asegurará de que foo no se encuentre en ninguna otra parte de la cadena.

1

De hecho, es casi un duplicado. Creo que la expresión regular que estás buscando es

(foo?!) *

3

Sobre la base de la respuesta de Daniel, creo que tengo algo que funciona:.

^(.(?!test))*$ 

La clave es que se necesita para hacer la afirmación negativa sobre cada carácter de la cadena

+0

No creo que esto tampoco funcione; coincidirá con la cadena 'prueba'. –

+0

Dispara: tienes razón. Esto es lo suficientemente bueno para mi escenario actual ya que ese borde no golpea, pero no resuelve completamente el problema. –

+0

Eliminé mi respuesta original y publiqué una nueva que debería resolver el problema por completo, incluida la carcasa de borde. Básicamente mi respuesta original negó las cadenas que comienzan con su subcadena, y la suya negó las cadenas que contienen la subcadena pero que no comienzan con ella. Ponerlos juntos es la solución. :) –

-1

Construir una expresión que coincide, y el uso de! partido() ... (negación lógica) eso es probablemente la forma en grep hace de todos modos ...

+0

No tengo control sobre el código que evalúa la coincidencia directamente, por lo que, desafortunadamente, no es una opción. –

Cuestiones relacionadas