¿Cómo escribo una expresión regular para que coincida con cualquier cadena que no cumpla con un patrón en particular? Me enfrento a una situación en la que tengo que hacer coincidir un patrón (A y ~ B).Regex: cómo hacer coincidir todo excepto un patrón en particular
Respuesta
Se puede usar un afirmación de preanálisis:
(?!999)\d{3}
Este ejemplo coincide con tres dígitos que no sean 999
.
Pero si le sucede no tener una aplicación de expresiones regulares con esta característica (ver Comparison of Regular Expression Flavors), es probable que construir una expresión regular con las características básicas de su propio.
Una expresión regular compatible con la sintaxis básica sólo sería:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Esto también se encontró ningún secuencia de tres dígitos que no es 999
.
Partido contra el patrón y el uso de la lengua de acogida para invertir el resultado booleano del partido. Esto será mucho más legible y mantenible.
Entonces acabo con (~ A o B) en lugar de (A y ~ B) .. no resuelve mi problema – notnot
Pseudo-código: totest cadena; if (! toTest.matches (A) y toTest.matches (B)) {...} –
que debería haber sido más claro - las piezas no son completamente independientes. Si A coincide con una parte de la cadena, nos preocupamos si ~ B coincide con el resto (pero no necesariamente con todo). Esto fue para la función FindSit de la línea de comandos de Windows, que encontré restringido a expresiones regulares verdaderas, por lo tanto, punto discutible. – notnot
El complemento de un idioma normal también es un idioma normal, pero para construirlo debe compilar el DFA para el idioma normal, y hacer cualquier cambio de estado válido en un error. Ver this para un ejemplo. Lo que la página no dice es que convirtió /(ac|bd)/
en /(a[^c]?|b[^d]?|[^ab])/
. La conversión de un DFA a una expresión regular no es trivial. Es más fácil si puede usar la expresión regular sin cambios y cambiar la semántica en el código, como se sugirió antes.
Si tuviera que lidiar con expresiones regex reales, entonces todo esto sería discutible. Regex ahora parece referirse al nebuloso espacio CSG-ish (?) De coincidencia de patrones que admite la mayoría de los lenguajes. Como necesito hacer coincidir (A y ~ B), no hay forma de eliminar la negación y aún así hacerlo todo en un solo paso. – notnot
Lookahead, como se describió anteriormente, lo habría hecho si findstr hiciera algo más allá de las verdaderas expresiones regulares de DFA. Todo es extraño y no sé por qué tengo que hacer este estilo de línea de comandos (lote ahora). Es solo otro ejemplo de mis manos atadas. – notnot
@notnot: ¿Está utilizando findstr de Windows? Entonces solo necesitas/v. Me gusta: findstr Un archivo de entrada | findstr/v B> archivoSalida.txt El primero coincide con todas las líneas con A, el segundo coincide con todas las líneas que no tienen B. – Juliano
Probablemente quiera mencionar que necesita unirse nuevamente. – tomdemuyt
Un enfoque similar es usar 'reemplazar' ' str.replace (/ re/g, '') ', luego no hay necesidad de volver a unirlos. también si arrojas un buen trailing \ s? como 'str.replace (/ \ re \ s?/g, '')' luego se deshace de los espacios duplicados que tendría de algo reemplazado en el medio de una cadena – jakecraige
(B)|(A)
a continuación, utilizar lo que el grupo 2 capturas ...
Necesita * capturar * no B, su objetivo no es simplemente ignorar todos los patrones B. – hexicle
Quizás sea incorrecto aquí, pero era exactamente lo que estaba buscando – user3473534
Si desea hacer coincidir una palabra A en una cadena y no para que coincida con una palabra B. Por ejemplo: Si usted tiene un texto:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Si desea buscar líneas de texto que tiene un perro a una mascota y no tiene gato puede utilizar esta expresión regular:
^(?=.*?\bdog\b)((?!cat).)*$
encontrará solamente segunda línea:
2. I have a pet - dog
No lo mencionó en la pregunta, pero el OP está usando el comando 'findstr' de DOS. Ofrece solo un pequeño subconjunto de las capacidades que espera encontrar en una herramienta de expresiones regulares; lookahead no está entre ellos. (Acabo de agregar la etiqueta [tag: findstr].) –
hm, sí, encontré ahora en uno de sus comentarios en las publicaciones. Vi a Regex en el título. De todos modos, si alguien encuentra esta publicación cuando busca la misma expresión regular, como yo lo hice, tal vez podría ser útil a alguien :) gracias por los comentarios – Aleks
Gracias Aleks. Tal como lo imaginaste, me crucé con esta pregunta por el título y me respondiste muy bien. – Hagelt18
notnot, resucitar a esta antigua pregunta porque tenía una solución simple que no era' t mencionado. (Encontró su pregunta mientras investigaba un regex bounty quest.)
Me enfrento a una situación en la que tengo que hacer coincidir un (A y ~ B) patrón.
La expresión regular básica para esto es terriblemente simple: B|(A)
Sólo ignora los partidos en general y examinar las capturas del grupo 1, que contendrá A.
Un ejemplo (con todas las renuncias de unos análisis de HTML en regex): a es dígitos, B es dígitos dentro de <a tag
la expresión regular: <a.*?<\/a>|(\d+)
Demo (mirar en el Grupo 1 en el panel inferior derecho)
Referencia
Mi respuesta aquí podría resolver su problema así:
https://stackoverflow.com/a/27967674/543814
- En lugar de Reemplazar, usaría Match.
- En lugar del grupo
$1
, leería el grupo$2
. - Grupo
$2
se hizo no capturar allí, lo que evitaría.
Ejemplo:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
El primer grupo de captura especifica el patrón que se desea evitar. El último grupo de captura captura todo lo demás. Simplemente lea ese grupo, $2
.
- 1. Regex: cómo hacer coincidir todo excepto un patrón en particular
- 2. Coincidir todo excepto cadenas especificadas
- 3. Regex para hacer coincidir un grupo anterior en el patrón?
- 4. Regex cómo hacer coincidir un carácter opcional
- 5. Cómo escribir un xpath para hacer coincidir todos los elementos excepto un elemento en particular
- 6. Regex - Haga coincidir cualquier secuencia de caracteres excepto una palabra en particular en una URL
- 7. Regex: permite todo excepto algunos caracteres seleccionados
- 8. RegEx para hacer coincidir cosas entre paréntesis
- 9. RegEx para hacer coincidir cadena completa
- 10. Regex - Coincidir atributo en un código HTML
- 11. Python Regex para hacer coincidir una cadena como un patrón y devolver el número
- 12. Patrón de Java para hacer coincidir cualquier secuencia de caracteres excepto una lista dada
- 13. Regex: cómo hacer coincidir el último punto en una cadena
- 14. ¿Cómo puedo unir cadenas que no coinciden con un patrón particular en Perl?
- 15. Regex para hacer coincidir cadenas específicas sin un prefijo dado
- 16. Regex para hacer coincidir un acorde de música
- 17. Regex: cómo hacer coincidir patrones superpuestos (quizás específicos de Python)
- 18. ¿Cómo hacer coincidir todos los archivos, excepto uno en grunt concat?
- 19. ¿Cómo hacer coincidir un "algo o nada" en un bash regex?
- 20. Regex para hacer coincidir el contenido del método
- 21. Regex para hacer coincidir los colores hexadecimales CSS
- 22. Regex para hacer coincidir los dígitos de longitud específica
- 23. Compojure regex para hacer coincidir una barra inclinada
- 24. RSpec: hacer coincidir una matriz de cadenas por regex
- 25. ¿Cómo hacer coincidir una cadena, ignorando la nueva línea final?
- 26. ¿Cómo hacer coincidir todas las direcciones de correo electrónico en un dominio específico usando regex?
- 27. sed/regex: Cómo hacer coincidir un '<' or '>' en una cadena
- 28. Regex para hacer coincidir fracciones descuidadas/números mixtos
- 29. RegEx necesario para hacer coincidir el número con 2 decimales
- 30. ¿Puede PCRE regex coincidir con un carácter nulo?
Look-ahead no es una sintaxis estándar de expresión regular, es una extensión Perl, solo funcionará en Perl, PCRE (Perl-Compatible RegEx) u otras implementaciones no estándar – Juliano
Puede no ser estándar, pero no la mayoría de los idiomas modernos lo soportan? ¿Qué idioma * no * admite look-aheads en estos días? –
Eso es verdad. Pero la mayoría de los sabores de expresiones regulares admiten esta función (consulte). –
Gumbo