2009-09-08 12 views
74

¿Se puede utilizar la expresión regular para hacer coincidir cualquier cadena excepto una constante de cadena específica, digamos "ABC"? ¿Es posible excluir solo una constante de cadena específica? Gracias tu ayuda de antemano.RegEx para excluir una constante de cadena específica

+1

Qué herramienta es usted ¿utilizando? Dependiendo de la herramienta, puede haber una forma de especificar esto externo a su expresión regular. grep admite una opción -v para invertir el sentido de la coincidencia, por ejemplo. –

+1

¿No puede simplemente 'si (/^ABC $ /) else {...} donde el otro sería el que no coincide ABC – Xetius

+0

? Así que está buscando hacer coincidir cada carácter de una cadena dada, excepto la parte ABC de ella ? En otras palabras, "Una cadena con ABC" coincidiría con "Una cadena con". –

Respuesta

4

Esto no es fácil, a menos que su motor regexp tenga un soporte especial para él. La forma más fácil sería utilizar una opción negativa al partido, por ejemplo:

$var !~ /^foo$/ 
    or die "too much foo"; 

Si no es así, usted tiene que hacer algo mal:

$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/ 
    or die "too much foo"; 

Ese básicamente dice "si se empieza con la no - f, el resto puede ser cualquier cosa; si comienza con f, no o, el resto puede ser cualquier cosa, de lo contrario, si se empieza fo, el siguiente carácter mejor que no había otra o".

+0

Eso no permitirá la cadena vacía, 'f',' fo' y 'foo'. – Gumbo

+0

@Gumbo: permite que la cadena vacía esté bien; observe que ($) es la primera alternativa, por lo que se acepta^$ (cadena vacía). Lo probé, y al menos en Perl 5.0.10 se acepta la cadena vacía. – derobert

+0

... perdón, perl 5.10.0, por supuesto! – derobert

93

Tiene que utilizar una aserción de búsqueda anticipada negativa.

(?!^ABC$) 

Por ejemplo, puede utilizar lo siguiente.

(?!^ABC$)(^.*$) 

Si esto no funciona en su editor, intente esto. La prueba se hace para trabajar en Ruby y JavaScript:

^((?!ABC).)*$ 
+1

Esto funcionará si está buscando una cadena que no incluye ABC. ¿Pero ese es el objetivo? ¿O el objetivo es hacer coincidir todos los personajes, excepto ABC? –

+0

Gracias por señalar eso, tienes razón; mi sugerencia solo evita las cadenas que comienzan con ABC. Olvidé anclar la afirmación. Voy a corregir eso. –

+0

Eso sigue siendo diferente de lo que estaba pensando. Quizás el interlocutor aclare lo que están buscando. –

3

usted podría utilizar búsqueda negativa hacia delante, o algo así:

^([^A]|A([^B]|B([^C]|$)|$)|$).*$ 

Tal vez podría simplificarse un poco.

3

En .NET se puede utilizar agrupación para su ventaja como esto:

http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

Se dará cuenta de que:

(ABC)|(.) 

se agarra todo excepto ABC en el segundo grupo. El paréntesis rodea a cada grupo. Por lo tanto (ABC) es el grupo 1 y grupo 2. Se

por lo que acaba de agarrar el segundo grupo como este en una sustitución (.):

$2 

O en la mirada de .NET en la colección de grupos dentro de la Clase Regex para un poco más de control.

Debería poder hacer algo similar también en la mayoría de las otras implementaciones de expresiones regulares.

ACTUALIZACIÓN: He encontrado una manera mucho más rápida de hacer esto aquí: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

Se sigue utilizando la agrupación (no puedo encontrar una manera que no utiliza la agrupación). Pero este método es más de 10 veces más rápido que el primero.

2

Pruebe esta expresión regular:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$ 

Se describe tres casos:

  1. menos de tres caracteres arbitraria
  2. exactamente tres caracteres, mientras cualquiera
    • el primero no es A o
    • el primero es A pero el segundo no es B o
    • la primera es A, la segunda B pero el tercero no es C
  3. más de tres caracteres arbitrarios
Cuestiones relacionadas