我正在尝试计算 C# 中字符串中的段落数。
我将段落定义为一段文本,其部分可以用新行分隔。段落必须由两个或多个新行分隔。所以:
这是一个段落。 这个 是 一个 段落。 这是一个段落。
我的第一个想法是将字符串分开\n\n
然后计算部分,但是当有多个行空间分隔段落时,在文件的开头和结尾,或者文件只有一行时,这不能正常工作.
如何通过正则表达式或其他方法准确获取字符串中的段落数?
我正在尝试计算 C# 中字符串中的段落数。
我将段落定义为一段文本,其部分可以用新行分隔。段落必须由两个或多个新行分隔。所以:
这是一个段落。 这个 是 一个 段落。 这是一个段落。
我的第一个想法是将字符串分开\n\n
然后计算部分,但是当有多个行空间分隔段落时,在文件的开头和结尾,或者文件只有一行时,这不能正常工作.
如何通过正则表达式或其他方法准确获取字符串中的段落数?
您对段落的定义可以很容易地转换为正则表达式,以获得所有段落:
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]*)*")
此外,这已经超出了我认为足够容易阅读的范围,因此可以使用一些重组,但我不确定最好的方法。
如果您很乐意避免使用正则表达式,那么这很有效:
var paragraphs =
text
.Split(
new [] { Environment.NewLine + Environment.NewLine },
StringSplitOptions.RemoveEmptyEntries)
.Count();
您可以尝试以下方法:
MultiParagraphString.Split(new [] {Environment.NewLine},
StringSplitOptions.RemoveEmptyEntries);
这将返回一个 IEnumerable。如果您想将它们转换为您的结构,只需使用 Select:
MultiParagraphString.Split(new [] {Environment.NewLine},
StringSplitOptions.RemoveEmptyEntries)
.Select(s => new ParagraphInfo(s)).ToList();
复制自问题如何分隔字符串中的段落