灵活的段落计数

本文关键字:段落计 | 更新日期: 2023-09-27 18:21:34

我已经仔细研究了这个问题,并试图修改答案,但我仍然被难住了。

我需要把段落数成一串。然而,段落可以用任意数量的换行符(1-n个换行符)分隔,以制表符或不以制表符开头(0-n个制表符),并且只包含空字符的空行不应该被计算在内(这是让我感到困惑的部分)。

示例文件:

First paragraph.
Second paragraph.
<tab>The third.
<tab> <tab> <tab>
<tab>The fourth.
The fifth.

如有任何帮助,我们将不胜感激。

灵活的段落计数

您可以在选项卡和换行符上进行拆分,并删除空行

text.Split(new string[] { Environment.NewLine, "'t", "'n" }, StringSplitOptions.RemoveEmptyEntries)
    .Where(x => x.Trim() != "")

请参阅演示:https://dotnetfiddle.net/Y79QjG

使用Split方法和此模式:

string[] result = Regex.Split(input, @"(?<='.)[^'S'n]*'n's*");

在线演示

图案详细信息:

(?<='.)     # lookbehind: preceded by a literal dot (you can add ! and ? too)
[^'S'n]*    # all whitespace characters except the linefeed (zero or more)
'n          # linefeed character
's*         # all whitespace characters (zero or more)

段落数是删除最后一个项目(如果该项目为空)后result[]中的项目数。然而,您可以使用来避免空项目的问题

string[] result = Regex.Split(input, @"(?<='.)[^'S'n]*'n(?>'s*)(?!'z)");

在线演示

string[] result = Regex.Split(input, @"(?<='.)(?!'s*'z)[^'S'n]*'n's*");

在线演示

(注意,如果你想提取每个段落,你需要修剪最后一项右侧的空白)

出于某种奇怪的原因,这似乎奏效了
这需要在段落之间留出一行空白
否则做是没有意义的。

只要做一场比赛,同时比赛,匹配下一件事。递增计数器。

 # @"(?m-)(?:'A|(?>^[^'S'r'n]*'r?'n){1,}(?!'z))"
 (?xm-)
 (?:
      'A 
   |  (?> ^ [^'S'r'n]* 'r? 'n ){1,}
      (?! 'z )
 )