msdos - Regex: cómo hacer coincidir todo excepto un patrón particular
findstr windows 10 (8)
¿Cómo escribo una expresión regular para que coincida con cualquier cadena que no cumple 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).
El complemento de un idioma normal también es un idioma normal, pero para construirlo debe crear el DFA para el idioma habitual y convertir cualquier cambio de estado válido en un error. Mira 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.
Haga coincidir el patrón y use el lenguaje de host para invertir el resultado booleano de la coincidencia. Esto será mucho más legible y mantenible.
Mi respuesta aquí podría resolver su problema también:
https://.com/a/27967674/543814
- En lugar de Reemplazar, usaría Match.
- En lugar del grupo
$1
, leería el grupo$2
. - El grupo
$2
se hizo sin 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 desea evitar. El último grupo de captura captura todo lo demás. Simplemente lea ese grupo, $2
.
Podría usar una afirmación de anticipación:
(?!999)/d{3}
Este ejemplo coincide con tres dígitos distintos de 999
.
Pero si no tiene una implementación de expresiones regulares con esta función (consulte Comparación de sabores de expresiones regulares ), probablemente tenga que crear una expresión regular con las funciones básicas por su cuenta.
Una expresión regular compatible con sintaxis básica solo sería:
[0-8]/d/d|/d[0-8]/d|/d/d[0-8]
Esto también coincide con cualquier secuencia de tres dígitos que no sea 999
.
Si desea hacer coincidir una palabra A en una cadena y no hacer coincidir una palabra B. Por ejemplo: si 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 TENGA un perro como mascota y NO tenga gato , puede usar esta expresión regular:
^(?=.*?/bdog/b)((?!cat).)*$
Encontrará solo segunda línea:
2. I have a pet - dog
no, resucitando esta antigua pregunta porque tenía una solución simple que no se mencionaba. (Encontró su pregunta mientras hacía una investigación para una búsqueda de recompensa de expresiones regulares ).
Me enfrento a una situación en la que tengo que hacer coincidir un patrón (A y ~ B).
La expresión regular básica para esto es aterradoramente simple: B|(A)
Simplemente ignora las coincidencias generales y examina las capturas del Grupo 1, que contendrán A.
Un ejemplo (con todos los descargos de responsabilidad sobre el análisis de html en expresiones regulares): A es dígitos, B es dígitos dentro de <a tag
La expresión regular: <a.*?<//a>|(/d+)
Demo (mira el Grupo 1 en el panel inferior derecho)
Referencia
Cómo hacer coincidir el patrón, excepto en las situaciones s1, s2, s3
(B)|(A)
luego usa lo que el grupo 2 captura ...