.NET Regular Expression: получить абзацы

Я пытаюсь получить абзацы из строки в C# с регулярными выражениями. По абзацам; Я имею в виду строковые блоки, заканчивающиеся на double или более \r\n. (НЕ абзацы HTML

)...

Вот пример текста:

Например, это абзац с возвратом каретки здесь
и новая строка здесь.

В этот момент начинается второй абзац. Абзац заканчивается, если двойное или более \ r \ n соответствует или
если достигнуто в конце строки ($).

Я попробовал шаблон:

Regex regex = new Regex(@"(.*)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Multiline);

но это не работает. Он соответствует каждой строке, заканчивающейся одним \ r \ n. Мне нужно, чтобы все символы, включая возврат одиночной каретки и символы новой строки, доходили до двойного \ r \ n.

3 ответа

Решение

.* быть жадным и потреблять столько, сколько может. Ваш второй набор () имеет $ поэтому выражение, которое используется (.*)(?), Для того, чтобы сделать .* не будьте жадным, следуйте за ним с ?,

Когда вы указываете RegexOptions.Multiline, .NET будет разбивать ввод на разрывы строк. Используйте RegexOptions.Singleline, чтобы он обрабатывал весь ввод как единое целое.

Regex regex = new Regex(@"(.*?)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Singleline);

Противоположный подход заключается в сопоставлении разделителей вместо абзацев, что делает проблему почти тривиальной. Рассматривать:

string[] paragraphs = Regex.Split(text, @"^\s*$", RegexOptions.Multiline);

Разделив входную строку на пустые строки, вы можете легко получить все абзацы. Если вам нужны только пустые строки без пробелов, вы можете упростить это еще больше и использовать parretn ^$, В этом случае вы также можете использовать не-регулярное выражение String.Split с массивом разделителей:

string[] separators = {"\n\n", "\r\r", "\r\n\r\n"};
string[] paragraphs = text.Split(separators,
                                 StringSplitOptions.RemoveEmptyEntries);

Вы должны использовать регулярное выражение? Такие инструменты, как COCO/R, также могут облегчить эту работу. Кроме того, это может оказаться быстрее, чем генерировать код во время выполнения с использованием регулярных выражений.

COMPILER YourParaProcessor
// your code goes here
TOKENS
newLine= '\r'|'\n'.
paraLetter = ANY - '\n' - '\r' .

YourParaProcessor 
=
 {Paragraph}
.

Paragraph =
  {paraLetter} '\r\n' .
Другие вопросы по тегам