我已查看了this question,并尝试修改答案,但我仍然难倒。
我需要计算字符串中的段落。但是,段落可以用任意数量的换行符(1-n换行符)分隔,有或没有制表符(0-n制表符),并且不应计算仅包含空字符的空行(这是“绊倒我的那部分”。
示例文件:
First paragraph.
Second paragraph.
<tab>The third.
<tab> <tab> <tab>
<tab>The fourth.
The fifth.
非常感谢任何帮助。
答案 0 :(得分:1)
使用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*");
(请注意,如果要提取每个段落,则需要修剪最后一项右侧的空格)
答案 1 :(得分:1)
您可以在制表符和换行符上拆分,然后删除空行
text.Split(new string[] { Environment.NewLine, "\t", "\n" }, StringSplitOptions.RemoveEmptyEntries)
.Where(x => x.Trim() != "")
答案 2 :(得分:0)
由于一些奇怪的原因,这似乎有效
这需要段落之间的空白。
否则就没有意义。
只要做一场比赛,匹配,匹配下一件事。增加一个计数器。
# @"(?m-)(?:\A|(?>^[^\S\r\n]*\r?\n){1,}(?!\z))"
(?xm-)
(?:
\A
| (?> ^ [^\S\r\n]* \r? \n ){1,}
(?! \z )
)