1

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

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

这是一个段落。

这个
是
一个
段落。



这是一个段落。

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

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

4

3 回答 3

5

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

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]*)*")

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

于 2014-06-02T04:27:53.647 回答
2

如果您很乐意避免使用正则表达式,那么这很有效:

var paragraphs =
    text
        .Split(
            new [] { Environment.NewLine + Environment.NewLine },
            StringSplitOptions.RemoveEmptyEntries)
        .Count();
于 2014-06-02T04:43:18.623 回答
-2

您可以尝试以下方法:

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

这将返回一个 IEnumerable。如果您想将它们转换为您的结构,只需使用 Select:

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

复制自问题如何分隔字符串中的段落

于 2014-06-02T04:10:34.200 回答