代码之家  ›  专栏  ›  技术社区  ›  Onur Yıldırım

.NET正则表达式:获取段落

  •  2
  • Onur Yıldırım  · 技术社区  · 14 年前

    我试图用正则表达式从C#中的字符串中获取段落。 所说的段落;是指以双精度或多精度结尾的字符串块(不是HTML段落<p>)。。。

    例如,这是一个带有回车符的段落
    还有一条新线路。

    至此,第二段开始。如果匹配了双精度或多精度,则段落结束\r\n或

    我试过这个模式:

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

    3 回复  |  直到 11 年前
        1
  •  3
  •   Rebecca Chernoff    14 年前

    .* 就是贪婪,尽可能多地消费。你的第二套 () 有一个 $ (.*)(?) . 为了使 .* 不要贪心,跟着它走 ? .

    当您指定RegexOptions.多行,.NET将在换行符上拆分输入。使用RegexOptions.单行使其将整个输入视为一个。

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

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

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

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

    string[] separators = {"\n\n", "\r\r", "\r\n\r\n"};
    string[] paragraphs = text.Split(separators,
                                     StringSplitOptions.RemoveEmptyEntries);
    
        3
  •  0
  •   Andrew Matthews    14 年前

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

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