【问题标题】:.NET Regular Expression: Get paragraphs.NET 正则表达式:获取段落
【发布时间】:2011-04-06 14:21:24
【问题描述】:

我正在尝试使用正则表达式从 C# 中的字符串中获取段落。 按段落;我的意思是字符串块以双倍或更多 \r\n 结尾。 (不是 HTML 段落

)...

这是一个示例文本:

例如这是一个带有回车的段落
并在此处换行。

此时,第二段开始。如果匹配到 double 或多个 \r\n 或
如果到达字符串末尾 ($),则段落结束。

我试过这个模式:

Regex regex = new Regex(@"(.*)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Multiline);

但这不起作用。它匹配以单个 \r\n 结尾的每一行。我需要的是获取所有字符,包括单个回车符和换行符,直到达到双 \r\n。

【问题讨论】:

  • 仅供参考,C# 不支持正则表达式。正则表达式支持全部在 .NET 中。

标签: c# regex paragraphs


【解决方案1】:

.* 正在贪婪并尽可能多地消耗。您的第二组() 有一个$,所以使用的表达式是(.*)(?)。为了使.* 不贪心,请在后面加上?

当您指定 RegexOptions.Multiline 时,.NET 将在换行符处拆分输入。使用 RegexOptions.Singleline 使其将整个输入视为一个。

Regex regex = new Regex(@"(.*?)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Singleline);

【讨论】:

    【解决方案2】:

    相反的方法是匹配分隔符而不是段落,使问题变得微不足道。考虑:

    string[] paragraphs = Regex.Split(text, @"^\s*$", RegexOptions.Multiline);
    

    通过用空行分割输入字符串,您可以轻松获得所有段落。如果您只想要没有空格的空行,您可以进一步简化它,并使用 parretn ^$。在这种情况下,您还可以使用带有分隔符数组的非正则表达式 String.Split:

    string[] separators = {"\n\n", "\r\r", "\r\n\r\n"};
    string[] paragraphs = text.Split(separators,
                                     StringSplitOptions.RemoveEmptyEntries);
    

    【讨论】:

    • 您的方法似乎也有效,但是当您需要为所有匹配项插入前缀时,rchern 的方法工作得更快。谢谢。
    【解决方案3】:

    你必须使用正则表达式吗?像COCO/R 这样的工具也可以让这项工作变得非常容易。此外,它可能被证明比在运行时使用正则表达式生成代码要快。

    COMPILER YourParaProcessor
    // your code goes here
    TOKENS
    newLine= '\r'|'\n'.
    paraLetter = ANY - '\n' - '\r' .
    
    YourParaProcessor 
    =
     {Paragraph}
    .
    
    Paragraph =
      {paraLetter} '\r\n' .
    

    【讨论】:

    • 有趣,-您如何以简单的方式实现这一点?
    猜你喜欢
    • 2014-08-05
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多