Ваше определение абзаца можно легко преобразовать в регулярное выражение, чтобы получить все абзацы:
Regex.Matches(s, "[^\r\n]+((\r|\n|\r\n)[^\r\n]+)*")
[^\r\n]+
означает ненулевое количество символов, отличных от новой строки. \r|\n|\r\n
— это различные формы новой строки. И в основном для абзаца вам нужно, чтобы они чередовались.
Я думаю, что это лучший подход, чем поиск разделителей абзацев, потому что поиск разделителей абзацев требует слишком много особых случаев для получения правильных результатов.
Чтобы рассматривать пустые строки как пустые строки, вы можете изменить определение «строки» с «ненулевое количество символов, отличных от новой строки», на «любое количество символов, отличных от новой строки, за которыми следует непустой символ, за которым следует любой количество символов, отличных от новой строки". Для простоты единственный символ, который я посчитал пустым, который не может быть частью разрыва строки, — это пробел, но вы можете включить и другие символы (например, табуляцию).
Regex.Matches(s, "[^\r\n]*[^ \r\n]+[^\r\n]*((\r|\n|\r\n)[^\r\n]*[^ \r\n]+[^\r\n]*)*")
Кроме того, это уже за гранью того, что я считаю достаточно легко читаемым, поэтому для этого может потребоваться некоторая реструктуризация, но я не уверен, что это лучший способ сделать это.
person
Community
schedule
02.06.2014
/[\r\n][\r\n]+/
- person Iłya Bursov   schedule 02.06.2014\r\n
закончить абзац. - person   schedule 02.06.2014CRLF
? Должен ли быть символ.
, за которым следует пустая строка или конец файла? Является ли строка пустой, если она содержит только пробелы? Каждый вариант - это другое регулярное выражение: P - person Corey   schedule 02.06.2014