Estoy usando RegexBuddy pero de todos modos tengo problemas con esto: \
Estoy procesando línea por línea un archivo. Construí un "modelo de línea" para que coincida con lo que quiero.
Ahora me gustaría hacer una coincidencia inversa ... es decir, quiero hacer coincidir líneas donde hay una cadena de 6 letras, pero solo si estas seis letras no son Andrea , ¿cómo debo hacer eso?
EDITAR: Escribiré el programa que usa esta expresión regular, todavía no sé si en python o php, estoy haciendo esto primero para aprender algunas expresiones regulares :) Hay diferentes tipos de línea, quería usar expresiones regulares para seleccionar el tipo que me interesa. Una vez que obtengo estas líneas, debo aplicar otro filtro para que no coincida con un valor conocido, necesito todos los demás, no ese. El (?! No deseado) funciona bastante bien, gracias. :-)
Espero que esto aclare la pregunta :)
fuente
Respuestas:
Suponiendo que su motor de expresiones regulares admita búsquedas anticipadas negativas ...
Editar: ... o tal vez prefiera usar
[A-Za-z]{6}
en lugar de.{6}
Editar (nuevamente): tenga en cuenta que las búsquedas anticipadas y retrospectivas generalmente no son la manera correcta de "invertir" una coincidencia de expresión regular. Las expresiones regulares no están realmente configuradas para hacer coincidencias negativas, lo dejan en cualquier idioma con el que las esté usando.
fuente
Para Python / Java,
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
fuente
some text
comienza la línea, devolverá el resultado incorrecto.?!
y no solo!
.Actualizado con comentarios de Alan Moore
En PCRE y variantes similares, puede crear una expresión regular que coincida con cualquier línea que no contenga un valor:
A esto se le llama una muestra codiciosa templada . La desventaja es que no funciona bien.
fuente
[\s\S]
, lo que sólo es útil en JavaScript) después de la segunda búsqueda hacia delante, y que no es necesario la primera de ellas:^(?:(?!Andrea).)*$
.[\S\s]
? OP está hablando de líneas coincidentes, sin contener la palabra "Andrea". No se trata de comprobar si toda la cadena contiene esta palabra. ¿Me estoy perdiendo de algo?Qué idioma estás usando? Las capacidades y la sintaxis de la implementación de expresiones regulares son importantes para esto.
Podría utilizar la anticipación. Usando Python como ejemplo
Para desglosar eso:
(?! Andrea) significa 'coincidir si los siguientes 6 caracteres no son "Andrea"'; si es así entonces
\ w significa un "carácter de palabra": caracteres alfanuméricos. Esto es equivalente a la clase [a-zA-Z0-9_]
\ w {6} significa exactamente 6 caracteres de palabra.
re.IGNORECASE significa que excluirá a "Andrea", "andrea", "ANDREA" ...
Otra forma es usar la lógica de su programa: use todas las líneas que no coincidan con Andrea y póngalas en una segunda expresión regular para verificar 6 caracteres. O primero verifique que haya al menos 6 caracteres de palabras y luego verifique que no coincida con Andrea.
fuente
Afirmación de anticipación negativa
Esta no es exactamente una coincidencia invertida, pero es lo mejor que puede hacer directamente con expresiones regulares. Sin embargo, no todas las plataformas los admiten.
fuente
Si desea hacer esto en RegexBuddy, hay dos formas de obtener una lista de todas las líneas que no coinciden con una expresión regular.
En la barra de herramientas del panel Prueba, establezca el alcance de la prueba en "Línea por línea". Cuando lo haga, aparecerá un elemento Listar todas las líneas sin coincidencias debajo del botón Listar todas en la misma barra de herramientas. (Si no ve el botón Mostrar todo, haga clic en el botón Coincidir en la barra de herramientas principal).
En el panel GREP, puede activar las casillas de verificación "basado en líneas" e "invertir resultados" para obtener una lista de líneas que no coinciden en los archivos que está revisando.
fuente
(?!
es útil en la práctica. Aunque estrictamente hablando, mirar hacia el futuro no es una expresión regular como se define matemáticamente.Puede escribir una expresión regular invertida manualmente.
Aquí hay un programa para calcular el resultado automáticamente. Su resultado es generado por máquina, que suele ser mucho más complejo que escribir uno a mano. Pero el resultado funciona.
fuente
Se me acaba de ocurrir este método que puede ser intensivo en hardware pero está funcionando:
Puede reemplazar todos los caracteres que coincidan con la expresión regular por una cadena vacía.
Este es un delineador:
notMatched = re.sub(regex, "", string)
Usé esto porque me vi obligado a usar una expresión regular muy compleja y no pude averiguar cómo invertir cada parte de ella en un período de tiempo razonable.
Esto solo le devolverá el resultado de la cadena, ¡no ningún objeto coincidente!
fuente
En perl puedes hacer
proceso ($ línea) if ($ línea = ~! / Andrea /);
fuente