regular - regex online
Regex hasta pero no incluido (3)
Para regex, ¿cuál es la sintaxis para buscar hasta pero no incluir? Más o menos como:
Haystack:
The quick red fox jumped over the lazy brown dog
Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z
La forma explícita de decir "buscar hasta X
pero no incluir X
" es:
(?:(?!X).)*
donde X
puede ser cualquier expresión regular.
En su caso, sin embargo, esto podría ser excesivo - aquí la manera más fácil sería
[^z]*
Esto coincidirá con cualquier cosa excepto z
y, por lo tanto, se detendrá justo antes de la próxima z
.
Entonces .*?quick[^z]*
coincidirá The quick fox jumps over the la
.
Sin embargo, tan pronto como tenga más de una letra simple para tener en cuenta, (?:(?!X).)*
Entra en juego, por ejemplo
(?:(?!lazy).)*
- Haga coincidir cualquier cosa hasta el comienzo de la palabra lazy
.
Esto está usando una afirmación de anticipación , más específicamente, una anticipación negativa.
.*?quick(?:(?!lazy).)*
coincidirá The quick fox jumps over the
.
Explicación:
(?: # Match the following but do not capture it:
(?!lazy) # (first assert that it''s not possible to match "lazy" here
. # then match any character
)* # end of group, zero or more repetitions.
Además, al buscar palabras clave, es posible que desee rodearlas con delimitadores de límite de palabras: /bfox/b
solo coincidirá con la palabra completa fox
pero no con el zorro en foxy
.
Nota
Si el texto que se va a combinar también puede incluir saltos de línea, tendrá que establecer la opción "punto coincide con todos" de su motor de expresiones regulares. Por lo general, puede lograrlo anteponiendo (?s)
a la expresión regular, pero eso no funciona en todos los motores de expresiones regulares (especialmente JavaScript).
Solución alternativa:
En muchos casos, también puede usar una solución más simple y más legible que utiliza un cuantificador perezoso. Al agregar un ?
para el *
cuantificador, intentará hacer coincidir la menor cantidad de caracteres posible desde la posición actual:
.*?(?=(?:X)|$)
coincidirá con cualquier número de caracteres, deteniéndose justo antes de X
(que puede ser cualquier expresión regular) o al final de la cadena (si X
no coincide). Es posible que también deba configurar la opción "dot matches all" para que esto funcione. (Nota: agregué un grupo que no capturó alrededor de X
para aislarlo confiablemente de la alternancia)
Prueba esto
(.*?quick.*?)z
Una sintaxis de regex anticipada puede ayudarte a lograr tu objetivo. Por lo tanto, una expresión regular para su ejemplo es
.*?quick.*?(?=z)
Y es importante notar el .*?
concordancia diferida antes del (?=z)
búsqueda anticipada: la expresión coincide con una subcadena hasta una primera aparición de la letra z
.
Aquí está la muestra del código C #:
const string text = "The quick red fox jumped over the lazy brown dogz";
string lazy = new Regex(".*?quick.*?(?=z)").Match(text).Value;
Console.WriteLine(lazy); // The quick red fox jumped over the la
string greedy = new Regex(".*?quick.*(?=z)").Match(text).Value;
Console.WriteLine(greedy); // The quick red fox jumped over the lazy brown dog