La forma explícita de decir "búsqueda hasta X
pero sin incluir X
" es:
(?:(?!X).)*
donde X
puede ser cualquier expresión regular.
En su caso, sin embargo, esto podría ser una exageración - aquí la forma más fácil sería
[^z]*
Esto coincidirá con nada excepto z
y por lo tanto dejar de hacerlo antes de la próxima z
.
Entonces .*?quick[^z]*
coincidirá con The quick fox jumps over the la
.
Sin embargo, tan pronto como usted tiene más de una simple carta a tener en cuenta, (?:(?!X).)*
entra en juego, por ejemplo
(?:(?!lazy).)*
- por nada hasta el comienzo de la palabra lazy
.
Esto está utilizando un lookahead assertion, más específicamente un aspecto negativo.
.*?quick(?:(?!lazy).)*
coincidirá con 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.
Por otra parte, en la búsqueda de palabras clave, es posible que desee rodearlos de palabra anclas de contorno: \bfox\b
sólo igualará la palabra completa fox
pero no el zorro en foxy
.
Nota
Si el texto que se ajustará también puede incluir saltos de línea, que tendrá que establecer el "punto detecta todos" opción 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 se puede utilizar una solución más simple, más fácil de leer que utiliza un cuantificador perezoso. Mediante la adición de un ?
a la *
cuantificador, se trata de hacer coincidir el menor número 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 el 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: He añadido un grupo sin fines de captura de alrededor de X
el fin de aislar de forma fiable desde la alternancia)
+1 realmente agradable respuesta, desafortunadamente no funciona con 'grep', pero esta [respuesta] (http://stackoverflow.com/a/5979402/ 354831) hace. –
@AlexandreLavoie: Interesante. ¿Por qué debería funcionar el otro y no este? Ambos usan aserciones de búsqueda anticipada. Quizás sea solo por el grupo '(?: ...)' no captor? ¿Funciona con '((?! X).) *'? –
Realmente no lo sé, no soy un experto en expresiones regulares ni grep. Estaba usando 'grep' para filtrar las solicitudes de una sola base de datos desde mysql bin transformet en sql. Aquí está la bestia: 'grep -Po" (? S) use database_to_keep (. *?) (? =^Use) "mysql-bin.000045.sql> filtered.sql' –