regulares - RegEx para excluir una constante de cadena específica
negacion expresion regular (5)
Esta pregunta ya tiene una respuesta aquí:
¿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.
Debe usar una afirmación de búsqueda anticipada negativa.
(?!^ABC$)
Por ejemplo, podría usar lo siguiente.
(?!^ABC$)(^.*$)
Si esto no funciona en su editor, intente esto. Está probado para trabajar en ruby y javascript:
^((?!ABC).)*$
En .NET puede usar la agrupación para su ventaja de esta manera:
http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31
Notarás que:
(ABC)|(.)
Tomará todo excepto ABC en el segundo grupo. El paréntesis rodea a cada grupo. Entonces (ABC) es el grupo 1 y (.) Es el grupo 2.
Así que solo agarras el segundo grupo como este en un reemplazo:
$2
O en .NET mira 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: Encontré una forma mucho más rápida de hacer esto aquí: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03
Todavía usa la agrupación (no puedo encontrar una manera que no use la agrupación). Pero este método es más de 10 veces más rápido que el primero.
Esto no es fácil, a menos que su motor regexp tenga un soporte especial para él. La manera más fácil sería usar una opción de concordancia negativa, por ejemplo:
$var !~ /^foo$/
or die "too much foo";
Si no, tienes que hacer algo malvado:
$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
or die "too much foo";
Ese básicamente dice "si comienza con no- f
, el resto puede ser cualquier cosa, si comienza con f
, no- o
, el resto puede ser cualquier cosa; de lo contrario, si comienza por, el siguiente carácter mejor no sería otro o
".
Prueba esta expresión regular:
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
Describe tres casos:
- menos de tres caracteres arbitrarios
- exactamente tres caracteres, mientras que
- el primero no es
A
, o - el primero es
A
pero el segundo no esB
, o - el primero es
A
, el segundoB
pero el tercero no esC
- el primero no es
- más de tres personajes arbitrarios
Puede usar lookahead negativo, o algo como esto:
^([^A]|A([^B]|B([^C]|$)|$)|$).*$
Tal vez podría simplificarse un poco.