Pregunta

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

¿Fue útil?

Solución

Podría usar una aserción anticipada:

(?!999)\d{3}

Este ejemplo coincide con tres dígitos distintos de 999.


Pero si no tiene una implementación de expresión regular con esta función (consulte Comparación de sabores de expresión regular ), probablemente deba crear una expresión regular con las características 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 <=>.

Otros consejos

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 TENGAN un perro para una mascota y NO tiene gato , puede usar esta expresión regular:

^(?=.*?\bdog\b)((?!cat).)*$

Solo encontrará la segunda línea:

2. I have a pet - dog

Coincide con el patrón y use el lenguaje host para invertir el resultado booleano de la coincidencia. Esto será mucho más legible y mantenible.

no, resucitar esta antigua pregunta porque tenía una solución simple que no se mencionó. (Encontré su pregunta mientras investigaba para una regex bounty quest .)

  

Me enfrento a una situación en la que tengo que coincidir con un (A y ~ B)   patrón.

La expresión regular básica para esto es terriblemente simple: B|(A)

Simplemente ignora las coincidencias generales y examina las capturas del Grupo 1, que contendrán A.

Un ejemplo (con todas las renuncias sobre el análisis de HTML en expresiones regulares): A son dígitos, B son dígitos dentro de <a tag

La expresión regular: <a.*?<\/a>|(\d+)

Demostración (mire 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 lenguaje regular también es un lenguaje regular, pero para construirlo debes construir el DFA para el idioma normal y realice cualquier cambio de estado válido en un error. Consulte esto para ver 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ó anteriormente.

patrón - re

str.split(/re/g) 

devolverá todo excepto el patrón.

Pruebe aquí

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

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 Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)"); se hizo sin captura allí, lo que evitarías.

Ejemplo:

<=>

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, <=>.

(B)|(A)

luego usa lo que el grupo 2 captura ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top