2012-04-24 15 views
9

Digamos que tengo el siguiente texto y quiero extraer el texto entre "Inicio de los números" y "Fin de los números" hay una cantidad dinámica de líneas y lo único que cambia en los números, por ejemplo: primero, segundo , etc. Cada archivo del que extraeré datos tiene diferentes cantidades de líneas entre "Inicio de números" y "Fin de números". ¿Cómo puedo escribir una expresión regular para que coincida con el contenido entre "Inicio de números" y "Fin de números" sin saber cuántas líneas habrá en el archivo entre Inicio de números "y" Fin de números "?Expresión regular ¿Coincide con líneas múltiples variables?

¡Saludos!

This is the first line This is the second line 

Start of numbers 

This is the first line 
This is the second line 
This is the third line 
This is the ...... line 
This is the ninth line 

End of numbers 

Respuesta

22

se debe utilizar el modo de SingleLine que le dice a su C# expresión regular que . coincide con cualquier carácter (no cualquier carácter excepto \n).

var regex = new Regex("Start of numbers(.*)End of numbers", 
        RegexOptions.IgnoreCase | RegexOptions.Singleline); 
+0

Nunca escuché eso. No digo que estés equivocado, pero la documentación [link] (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx) no parece decir que ni tampoco esta regex [link] (http://regexr.com?30oag): –

+2

@DavidZ .: No. SingleLine afecta '.', MultiLine afecta'^'y' $ '. Sí, puede haber situaciones en las que tiene sentido especificar * both * SingleLine y MultiLine. :-) – Heinzi

+0

Sí, tienes razón. MultiLine afecta^y $, tenía la impresión de que SingleLine también pero mirando los documentos no es el caso. –

2

usted debe ser capaz de igualar las cadenas multilínea sin problema. Sólo recuerde añadir los caracteres correctos en (\n para las nuevas líneas).

string pattern = "Start of numbers(.|\n)*End of numbers"; 
Match m = Regex.Matches(input, pattern); 

Esto es más fácil si se puede pensar su cadena con los caracteres ocultos.

Start of numbers\n\nThis is the first line\nThis is the second line\n ... 
0

Algo como esto:

^(inicio) ([\ s \ n \ d \ w] *) (fin) $

Dónde conseguir el segundo grupo. Incluso puede nombrar el grupo si lo desea. Entonces, el punto es que lees todo en una secuencia y luego obtienes el resultado de la expresión regular.

Editar:

tiene que editar un poco. Si tu coincidencia puede estar en el centro en algún lugar, coloca los caracteres de inicio (^) y final ($). (inicio) ([\ s \ n \ dw] *) (fin)

Y tenga en cuenta que esto le dejará solo las líneas que desea obtener. Luego maneja estas líneas.

Cuestiones relacionadas