2008-09-15 7 views
5

Je recherche une expression rationnelle multiligne qui correspondra aux occurrences après une ligne vide. Par exemple, avec un exemple d'email ci-dessous, je voudrais faire correspondre "From: Alex". ^From:\s*(.*)$ fonctionne pour correspondre à n'importe quelle ligne De, mais je veux qu'il soit limité aux lignes dans le corps (n'importe quoi après la première ligne vide).Multiline C# Regex pour correspondre après une ligne vide

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

fyi 

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

Party! 

Répondre

2

Je ne suis pas sûr de la syntaxe des expressions régulières C#, mais vous devriez avoir un moyen d'ancrer au début de la chaîne (pas le début de la ligne comme ^). Je vais appeler que « \ A » dans mon exemple:

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

Assurez-vous activer l'option correspondante multiligne, cependant qui fonctionne, pour faire « » match \ n

+0

Merci. Ce dont j'avais besoin était d'activer le mode Singleline aussi, et d'utiliser. *? au lieu de .*. – user10392

0

L'écriture d'expressions régulières compliquées pour de tels travaux est une mauvaise idée IMO. Il est préférable de combiner plusieurs requêtes simples. Par exemple, recherchez d'abord "\ r \ n \ r \ n" pour trouver le début du corps, puis exécutez la regex simple sur le corps.

0

Ceci utilise une assertion de veille. Le groupe 1 vous donnera la ligne "De", et le groupe 2 vous donnera la valeur réelle ("Alex", dans votre exemple).

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

Les \s{2,} matchs au moins deux caractères blancs, ce qui signifie votre première: De James ne sera pas touché. Ensuite, il suffit de chercher le prochain "De:" et commencer à capturer à partir de là.

Utilisez ceci avec RegexOptions.SingleLine et RegexOptions.ExplicitCapture, cela signifie que le groupe externe ne frappera pas.

Questions connexes