我正在尝试计算C#中字符串中段落的数量。
我将一个段落定义为一个文本块,其中的部分可能用新行分隔。段落必须用两个或更多的新行分隔。所以:
This is a paragraph. This is a paragraph. This is a paragraph.
我的第一个想法是通过\n\n
分隔字符串然后计算部分,但是当文件的开头和结尾有多个分隔段落的行间距时,这不能正常工作,或者如果文件只有一行。
如何通过正则表达式或其他方法准确获取字符串中的段落数?
答案 0 :(得分:4)
您对段落的定义可以很容易地转换为正则表达式,以获取所有段落:
Regex.Matches(s, "[^\r\n]+((\r|\n|\r\n)[^\r\n]+)*")
[^\r\n]+
表示非换行符号的非零数。 \r|\n|\r\n
是各种形式的换行符。基本上,对于一个段落,你需要这些替代。
我认为这比查找段落分隔符更好,因为查找段落分隔符需要太多特殊情况才能给出正确的结果。
要将空行视为空行,您可以更改" line"的定义。来自"非新数字的非零数字" to"任意数量的非换行符,后跟非空字符,后跟任意数量的非换行符"。为简单起见,我唯一被认为是空白的字符是空格字符,但您可能还想包含其他字符(例如制表符)。
Regex.Matches(s, "[^\r\n]*[^ \r\n]+[^\r\n]*((\r|\n|\r\n)[^\r\n]*[^ \r\n]+[^\r\n]*)*")
此外,这已经超出了我认为足够易读的范围,所以这可能会使用一些重组,但我不确定最好的方法。
答案 1 :(得分:2)
如果您乐意避免使用正则表达式,那么这可行:
var paragraphs =
text
.Split(
new [] { Environment.NewLine + Environment.NewLine },
StringSplitOptions.RemoveEmptyEntries)
.Count();
答案 2 :(得分:-2)
您可以尝试以下方法:
MultiParagraphString.Split(new [] {Environment.NewLine},
StringSplitOptions.RemoveEmptyEntries);
这将返回一个IEnumerable。如果要将它们转换为结构,只需使用选择:
MultiParagraphString.Split(new [] {Environment.NewLine},
StringSplitOptions.RemoveEmptyEntries)
.Select(s => new ParagraphInfo(s)).ToList();
复制