.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' .