Respuestas:
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 expresión regular con esta característica (vea Comparación de sabores de expresión regular ), probablemente tenga que construir 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 lo 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 TENGAN un perro como mascota y NO tiene gato , puede usar esta expresión regular:
^(?=.*?\bdog\b)((?!cat).)*$
Encontrará solo la segunda línea:
2. I have a pet - dog
findstr
comando DOS . Ofrece solo un pequeño subconjunto de las capacidades que espera encontrar en una herramienta de expresiones regulares; La búsqueda anticipada no está entre ellos. (Acabo de agregar la etiqueta findtr .)
Haga coincidir el patrón y use el idioma del 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é tu pregunta mientras investigabas para una búsqueda de recompensas 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 terriblemente simple: B|(A)
Simplemente ignore las coincidencias generales y examine 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
\d
con [[:digit:]]
. La primera referencia menciona que es específica de Perl y PHP: "Existe una variación que usa la sintaxis específica de Perl y PHP que logra lo mismo".
El complemento de un lenguaje regular también es un lenguaje regular, pero para construirlo debe construir el DFA para el lenguaje regular y hacer que cualquier cambio de estado válido se convierta en un error. Vea esto para un ejemplo. Lo que la página no dice es que se 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.
replace
str.replace(/re/g, '')
, entonces no hay necesidad de volver a unirse a ellos. ¿también si arrojas un buen seguimiento? como str.replace(/\re\s?/g, '')
continuación a deshacerse de los espacios duplicados que tendría que partir de algo que se sustituye en el medio de una cadena
Mi respuesta aquí también podría resolver su problema:
https://stackoverflow.com/a/27967674/543814
$1
, leerías grupo $2
.$2
se hizo sin captura allí, lo que evitarías.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
,.
findstr
etiqueta ya que todas las respuestas aquí no son válidas para la etiqueta.