灵活的段落计数

时间:2014-09-10 17:42:19

标签: c# regex

我已查看了this question,并尝试修改答案,但我仍然难倒。

我需要计算字符串中的段落。但是,段落可以用任意数量的换行符(1-n换行符)分隔,有或没有制表符(0-n制表符),并且不应计算仅包含空字符的空行(这是“绊倒我的那部分”。

示例文件:

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

The fifth.

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

使用Split方法和此模式:

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

online demo

模式详细信息:

(?<=\.)     # 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)");

online demo

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

online demo

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

答案 1 :(得分:1)

您可以在制表符和换行符上拆分,然后删除空行

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

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

答案 2 :(得分:0)

由于一些奇怪的原因,这似乎有效 这需要段落之间的空白。
否则就没有意义。

只要做一场比赛,匹配,匹配下一件事。增加一个计数器。

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

 (?xm-)
 (?:
      \A 
   |  (?> ^ [^\S\r\n]* \r? \n ){1,}
      (?! \z )
 )