Regex: cómo hacer coincidir todo excepto un patrón particular

¿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).

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 syntax 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 

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.

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

La expresión regular: |(\d+)

Demostración (mira el Grupo 1 en el panel inferior derecho)

Referencia

Cómo hacer coincidir el patrón, excepto en las situaciones s1, s2, s3

Cómo hacer coincidir un patrón a menos que ...

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 esto 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.

patrón – re

 str.split(/re/g) 

devolverá todo excepto el patrón.

Prueba aquí

Mi respuesta aquí podría resolver su problema también:

https://stackoverflow.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 .

 (B)|(A) 

luego usa lo que el grupo 2 captura …