【问题标题】:How to count the number of paragraphs in a string in C#如何在C#中计算字符串中的段落数
【发布时间】:2014-07-22 03:04:31
【问题描述】:

我正在尝试计算 C# 中字符串中的段落数。

我将段落定义为一个文本块,其部分可以用新行分隔。段落必须由两个或多个新行分隔。所以:

这是一个段落。 这 是 一种 段落。 这是一个段落。

我的第一个想法是通过\n\n 分隔字符串,然后计算部分,但是当有多个行空间分隔段落时,在文件的开头和结尾,或者如果该文件只有一行。

如何通过正则表达式或其他方法准确获取字符串中的段落数?

【问题讨论】:

  • 正则表达式可以做到这一点,比如/[\r\n][\r\n]+/
  • @Lashane 让\r\n 结束一个段落。
  • 如何定义段落的结尾?是否有多个CRLF 对的任何系列?必须有一个. 后跟一个空行或文件结尾吗?如果一行只包含空格,它是空的吗?每个选项都是不同的正则表达式:P

标签: c# regex paragraph paragraphs


【解决方案1】:

您对段落的定义可以很容易地转换为正则表达式,以获得所有段落:

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]*)*")

另外,这已经超出了我认为足够容易阅读的范围,因此可以进行一些重组,但我不确定最好的方法。

【讨论】:

  • @user3651656 Regex.Matches(ttes, "[^\r\n]+((\r|\n|\r\n)[^\r\n]+)*").Count 应该给出计数
  • 谢谢。只是出于好奇,有什么方法可以让它将只包含空格字符的行视为空行?
  • @user3651656 应该是可以的,但是如果这已经很难阅读,它会变得更糟。当我有机会再次测试时会编辑。
  • @user3651656 已更新。
【解决方案2】:

如果您乐于避免使用正则表达式,那么这可行:

var paragraphs =
    text
        .Split(
            new [] { Environment.NewLine + Environment.NewLine },
            StringSplitOptions.RemoveEmptyEntries)
        .Count();

【讨论】:

  • 这很聪明!没错,当您只想计算有多少段落时,有时在段落中包含一个虚假的换行符并不重要。
  • @hvd - 而且,坦率地说,我发现正则表达式只会让事情变得难以理解。当然,正则表达式对计算机很有效,但对人类来说就很糟糕。
  • 实际上,您的答案确实漏掉了一种情况:它不处理尾随的奇数换行符:它为"a" + Environment.NewLine + Environment.NewLine + Environment.NewLine 返回两个。
  • 是的,我同意正则表达式很难阅读,但我主要关注的是正确性,然后才是可读性。换句话说,我选择了我能想到的最易读的方法来获得正确的答案。我没有考虑你的方法,我没有想到它,但如果我有的话,我可能也会将它作为答案发布。
  • 我不确定这是否是我的字符串的格式(它是从 WinRT 中的 RichEditBox 的内容复制的),但对我来说,无论字符串中的内容是什么,这似乎都会返回 1 .有没有办法解决这个问题?
【解决方案3】:

您可以尝试以下方法:

MultiParagraphString.Split(new [] {Environment.NewLine}, 
           StringSplitOptions.RemoveEmptyEntries);

这将返回一个 IEnumerable。如果您想将它们转换为您的结构,只需使用 Select:

MultiParagraphString.Split(new [] {Environment.NewLine}, 
           StringSplitOptions.RemoveEmptyEntries)
          .Select(s => new ParagraphInfo(s)).ToList();

复制自问题How to separate paragraphs in a string

【讨论】:

  • 你测试了吗?返回 6。
  • 返回每一行,而不是每一段。
  • 我认为这个解决方案可能需要一些修改。
  • 什么样的修改?那么这不是对所提出问题的答案。
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多