2010-06-18 11 views
6

¿Cómo puedo usar la expresión regular para buscar todo el texto antes del texto "Todo el texto anterior a esta línea se incluirá"?buscar todo el texto antes de usar regex

tengo incluye un texto de ejemplo a continuación, por ejemplo,

This can include deleting, updating, or adding records to your database, which would then be reflex. 

All text before this line will be included 

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead. 

Respuesta

9
(.*?)All text before this line will be included 

Dependiendo de lo normal en particular marco expresión que está usando, puede que tenga que incluir una bandera para indicar que . puede coincidir con caracteres de nueva línea también.

El primer (y único) subgrupo incluirá el texto coincidente. La forma de extraer eso dependerá nuevamente del idioma y del marco de expresión regular que esté utilizando.

Si desea incluya el texto "Todos los textos antes de esta línea ...", entonces todo el emparejamiento es lo que desea.

+1

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. –

+1

Quise dar a entender que el primer subgrupo incluiría el texto correspondiente. Editaré para aclarar – VoteyDisciple

+1

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. –

1

Esto debe hacerlo:

<?php 
$str = "This can include deleting, updating, or adding records to your database, which would then be reflex. 

All text before this line will be included 

You can make this a bit more sophisticated by encrypting the random number and then verifying that it is still a number when it is decrypted. Alternatively, you can pass a value and a key instead."; 

echo preg_filter("/(.*?)All text before this line will be included.*/s","\\1",$str); 
?> 

Devuelve:

This can include deleting, updating, or adding records to your database, which would then be reflex. 
11

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.

+0

¡Ah, gracias, eso es útil para saber! – vimist

+0

Lástima que el OP nunca aceptó una respuesta. todos han sido muy útiles para mí. – helgatheviking