Comenzando con una explicación ... Saltar al final para obtener respuestas rápidas
Para hacer coincidir hasta una pieza específica de texto, y confirme que está allí pero no lo incluye con la coincidencia, puede usar una anticipación positiva, usando la notación (?=regex)
Esto confirma que 'regex' existe en esa posición, pero coincide solo con la posición de inicio, no con su contenido.
Por lo tanto, esto nos da la expresión:
.*?(?=All text before this line will be included)
Dónde .
es cualquier carácter, y *?
es un partido flojo (consume menor cantidad posible, en comparación con regulares *
que consume la mayor cantidad posible).
Sin embargo, en casi todos los sabores regex .
se excluirá la nueva línea, por lo que debemos utilizar explícitamente una bandera para incluir nuevas líneas. La bandera que se utiliza es s
, (que significa "modo de línea única", aunque también se conoce como modo "DOTALL" en algunos sabores).
Y esto se puede implementar de varias maneras, incluyendo ...
A nivel mundial, para/expresiones regulares basadas en:
/regex/s
línea, globales para la expresión regular:
(?s)regex
En línea, se aplica solo a la parte entre paréntesis:
(?s:reg)ex
Y como un argumento de función (depende del idioma con el que está haciendo la expresión regular).
Así que, probablemente, la expresión regular que desea es la siguiente:
(?s).*?(?=All text before this line will be included)
Sin embargo, hay algunas advertencias:
En primer lugar, no todos los sabores de expresiones regulares compatibles con cuantificadores perezosos - puede que tenga que usar solo .*
, (o utilizar potencialmente una lógica más compleja según los requisitos precisos si "Todo el texto antes ... "puede aparecer varias veces).
En segundo lugar, no todos los sabores regex admiten lookaheads, por lo que tendrá que usar grupos capturados para obtener el texto que desea emparejar.
Por último, no siempre se puede especificar banderas, como la s
arriba, es posible que necesite ya sea partido "nada ni salto de línea" o tal vez (.|\n)
[\s\S]
(espacios en blanco y no espacios en blanco) para obtener el correspondiente equivalente.
Si usted está limitado por todos ellos (creo que la aplicación XML es), entonces usted tiene que hacer:
([\s\S]*)All text before this line will be included
y luego extraer el primer subgrupo del resultado del partido.
Esta coincidencia * incluirá * el texto "Todos los textos antes de que se incluya esta línea" - no está claro si eso se desea de la pregunta original, pero consulte mi respuesta sobre cómo excluirla si no lo hace. –
Quise dar a entender que el primer subgrupo incluiría el texto correspondiente. Editaré para aclarar – VoteyDisciple
Sí, pero yo diría que la búsqueda anticipada está conceptualmente más cerca de lo que se desea (y, por lo tanto, es una mejor opción). Por supuesto, mirar hacia adelante no siempre está disponible, pero si no lo tienes, probablemente tampoco tengas una coincidencia perezosa ... He intentado agregar toda esta información a mi respuesta, espero que esté claro. –