【问题标题】:Why is the regular expression not matching the last part of the string?为什么正则表达式不匹配字符串的最后一部分?
【发布时间】:2019-05-28 17:50:44
【问题描述】:

为什么是这个正则表达式:

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

不匹配以下字符串的最后一行? (请注意,每行开头的空格是两个制表符,但已转换为所有空格,至少在我的浏览器中 - 但在编辑模式下是正确的。)不应该 @ 987654325@ 量词导致最外层括号中的模式部分也匹配最后一行?

// // 概括: // 绝对什么也不做,除了什么都不做之外什么都不做 // 全部。

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

【问题讨论】:

  • 可能又是行尾。使用\r?\n
  • 我在 regexstorm 上试过了,效果很好
  • @WiktorStribiżew 你能详细说明一下吗?你的建议奏效了,为什么呢?所有的行尾肯定都是\r\n,我刚刚确认了。
  • @rory.ap 是的,我明白了。 .NET 正则表达式的问题在于 . 也匹配 CR 符号。 . 仅与 \n 不匹配(默认情况下)。因此,内部嵌套的(.+) 抓住了 CR,并没有将其归还。 Summary:(\r\n\t\t// {5}([^\r\n]+))+ 也可以。
  • 太棒了!谢谢@WiktorStribiżew。

标签: .net regex


【解决方案1】:

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

  • 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

【讨论】:

    【解决方案2】:

    我猜我们可能想要的是一个传递新行的表达式,比如这个:

    Summary:([\s\S]*)
    

    Summary:([\w\W]*)
    

    Summary:([\d\D]*)
    

    DEMO

    【讨论】:

    • [\S\s] 等价于 . 开启“单行”模式。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多