Многострочный C # Regex, чтобы соответствовать после пустой строки - PullRequest
5 голосов
/ 16 сентября 2008

Я ищу многострочное регулярное выражение, которое будет соответствовать вхождениям после пустой строки. Например, учитывая приведенный ниже пример электронного письма, я бы хотел сопоставить «От: Алекс». ^From:\s*(.*)$ работает, чтобы соответствовать любой строке From, но я хочу, чтобы она была ограничена строками в теле (что угодно после первой пустой строки).

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

fyi

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

Party!

Ответы [ 4 ]

2 голосов
/ 16 сентября 2008

Я не уверен в синтаксисе регулярных выражений C #, но у вас должен быть способ привязки к началу строки (а не к началу строки, например ^). Я назову это «\ A» в моем примере:

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

Убедитесь, что вы включили опцию многострочного сопоставления, однако это работает, чтобы сделать "." совпадение \ n

0 голосов
/ 16 сентября 2008
\s{2,}.+?(.+?From:\s(?<Sender>.+?)\s)+?

\s{2,} соответствует как минимум двум пробелам, что означает, что ваш первый From: Джеймс не попадет. Тогда вам нужно просто найти следующее «От:» и начать захват оттуда.

Используйте это с RegexOptions.SingleLine и RegexOptions.ExplicitCapture, это означает, что внешняя группа не ударит.

0 голосов
/ 16 сентября 2008

Это использует утверждение о прошлом. Группа 1 даст вам строку «От», а группа 2 даст вам фактическое значение («Алекс», в вашем примере).

(?<=\n\n).*(From:\s*(.*?))$
0 голосов
/ 16 сентября 2008

Написание сложных регулярных выражений для таких заданий - плохая идея IMO. Лучше объединить несколько простых запросов. Например, сначала найдите «\ r \ n \ r \ n», чтобы найти начало тела, а затем выполните простое регулярное выражение над телом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...