为什么正则表达式与字符串的最后部分不匹配?

时间:2019-05-28 17:50:45

标签: .net regex

为什么要使用此正则表达式:

Summary:(\r\n\t\t\/\/     (.+))+

不匹配以下字符串的最后一行? (请注意,每行开头的空格是两个制表符,但至少在我的浏览器中,它已转换为所有空格-不过在编辑模式下是正确的。) {1}}量词是否也使最外面的parens中的图案部分也与最后一行匹配?

        //
        // Summary:
        //     Do absolutely nothing and don't do anything else other than to do nothing at
        //     all.

这是http://regexstorm.net/tester上的结果:

enter image description here

2 个答案:

答案 0 :(得分:2)

对我来说,这似乎是个错误。看看发生了什么:

  • Summary:首先匹配
  • (\r\n\t\t// (.+))+-在迭代1时,它抓取"\r\n\t\t// Do absolutely nothing and don't do anything else other than to do nothing at\r"(请注意,.NET正则表达式中的最后一个\r.缺省情况下与CR符号匹配) )
  • +量词向正则表达式引擎发送信号,以尝试与当前匹配项右边的子字符串进行匹配,即"\n\t\t// all."。它无法匹配,因为它以\n开头。该模式应像"\r\n\t\t// (.+)\r\n\t\t// (.+)"这样展开,以此类推,即\r\n\t\t// (.+)(?:\r\n\t\t// (.+))*,但它应does not turn on backtracking with (.+)。实际上,当.+符合回溯条件时,正则表达式引擎可以用不同的方式重新匹配字符串,但是以某种方式与CR匹配的.并不想将其退回 >。

解决方法是匹配第一个\r作为可选符号:

Summary:(\r?\n\t\t//     (.+))+

或者,仅将CR和LF以外的任何字符与[^\r\n]+匹配(这将确保第2组捕获堆栈中的值更干净):

Summary:(\r\n\t\t//     ([^\r\n]+))+

请参见regex demo

答案 1 :(得分:-1)

我猜想我们可能想在这里使用的表达式是用于传递新行的表达式,例如以下代码:

Summary:([\s\S]*)

Summary:([\w\W]*)

Summary:([\d\D]*)

DEMO

enter image description here