.NET Regular Expression: получить абзацы - PullRequest
2 голосов
/ 01 сентября 2010

Я пытаюсь получить абзацы из строки в 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 ]

3 голосов
/ 01 сентября 2010

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

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

Regex regex = new Regex(@"(.*?)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Singleline);
2 голосов
/ 01 сентября 2010

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

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);
0 голосов
/ 01 сентября 2010

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

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

YourParaProcessor 
=
 {Paragraph}
.

Paragraph =
  {paraLetter} '\r\n' .
...