如何计算C#中字符串中的段落数

时间:2014-06-02 03:38:53

标签: c# regex paragraph paragraphs

我正在尝试计算C#中字符串中段落的数量。

我将一个段落定义为一个文本块,其中的部分可能用新行分隔。段落必须用两个或更多的新行分隔。所以:

This is a paragraph.

This
is
a
paragraph.



This is a paragraph.

我的第一个想法是通过\n\n分隔字符串然后计算部分,但是当文件的开头和结尾有多个分隔段落的行间距时,这不能正常工作,或者如果文件只有一行。

如何通过正则表达式或其他方法准确获取字符串中的段落数?

3 个答案:

答案 0 :(得分:4)

您对段落的定义可以很容易地转换为正则表达式,以获取所有段落:

Regex.Matches(s, "[^\r\n]+((\r|\n|\r\n)[^\r\n]+)*")

[^\r\n]+表示非换行符号的非零数。 \r|\n|\r\n是各种形式的换行符。基本上,对于一个段落,你需要这些替代。

我认为这比查找段落分隔符更好,因为查找段落分隔符需要太多特殊情况才能给出正确的结果。

要将空行视为空行,您可以更改" line"的定义。来自"非新数字的非零数字" to"任意数量的非换行符,后跟非空字符,后跟任意数量的非换行符"。为简单起见,我唯一被认为是空白的字符是空格字符,但您可能还想包含其他字符(例如制表符)。

Regex.Matches(s, "[^\r\n]*[^ \r\n]+[^\r\n]*((\r|\n|\r\n)[^\r\n]*[^ \r\n]+[^\r\n]*)*")

此外,这已经超出了我认为足够易读的范围,所以这可能会使用一些重组,但我不确定最好的方法。

答案 1 :(得分:2)

如果您乐意避免使用正则表达式,那么这可行:

var paragraphs =
    text
        .Split(
            new [] { Environment.NewLine + Environment.NewLine },
            StringSplitOptions.RemoveEmptyEntries)
        .Count();

答案 2 :(得分:-2)

您可以尝试以下方法:

MultiParagraphString.Split(new [] {Environment.NewLine}, 
           StringSplitOptions.RemoveEmptyEntries);

这将返回一个IEnumerable。如果要将它们转换为结构,只需使用选择:

MultiParagraphString.Split(new [] {Environment.NewLine}, 
           StringSplitOptions.RemoveEmptyEntries)
          .Select(s => new ParagraphInfo(s)).ToList();

从问题How to separate paragraphs in a string

复制