2008-09-15 8 views
5

Estoy buscando una expresión regular multilínea que coincida con las ocurrencias después de una línea en blanco. Por ejemplo, dado un ejemplo de correo electrónico a continuación, me gustaría hacer coincidir "De: Alex". ^From:\s*(.*)$ funciona para que coincida con cualquier línea De, pero quiero que se restrinja a líneas en el cuerpo (cualquier cosa después de la primera línea en blanco).Multiline C# Regex para que coincida después de una línea en blanco

 
Received: from a server 
Date: today 
To: Ted 
From: James 
Subject: [fwd: hi] 

fyi 

----- Forwarded Message ----- 
To: James 
From: Alex 
Subject: hi 

Party! 

Respuesta

2

No estoy seguro de la sintaxis de las expresiones regulares de C#, pero debe tener una forma de anclar al principio de la cadena (no al comienzo de la línea como ^). Voy a llamar a que "\ A" en mi ejemplo:

\A.*?\r?\n\r?\n.*?^From:\s*([^\r\n]+)$ 

Asegúrese de encender la opción de varias líneas juego en adelante, sin embargo, que trabaja, para hacer "" coincidencia \ n

+0

Gracias. Lo que necesitaba era activar también el modo Singleline y usar. *? en lugar de .*. – user10392

0

Escribir expresiones regulares complicadas para tales trabajos es una mala idea IMO. Es mejor combinar varias consultas simples. Por ejemplo, primero busque "\ r \ n \ r \ n" para encontrar el inicio del cuerpo, luego ejecute la expresión regular simple sobre el cuerpo.

0

Esto está usando una afirmación de mirar hacia atrás. El Grupo 1 le dará la línea "Desde", y el Grupo 2 le dará el valor real ("Alex", en su ejemplo).

(?<=\n\n).*(From:\s*(.*?))$ 
0
\s{2,}.+?(.+?From:\s(?<Sender>.+?)\s)+? 

Los partidos \s{2,} al menos dos espacios en blanco, lo que significa que su primera De: James no se golpeó. Entonces solo es cuestión de buscar el siguiente "De:" y comenzar a capturar desde allí.

Use esto con RegexOptions.SingleLine y RegexOptions.ExplicitCapture, esto significa que el grupo externo no golpeará.

Cuestiones relacionadas