【问题标题】:How do regex positive look-behinds work?正则表达式积极的后视如何工作?
【发布时间】:2014-02-19 05:19:04
【问题描述】:

我一直在从堆栈中解决旧问题,以便提高我的正则表达式知识。因为我对正则表达式有基本的了解,所以其中大多数都很容易,但这个问题regex problem 很难。

它要求一个正则表达式,从这种字符串ou=persons,ou=(.*),dc=company,dc=org 中提取最后一个紧跟在逗号前面的字符串,而不是(.*)。在最后一种情况下,这应该是dc=company,dc=org

解决方案是(?<=,(?!.*\Q(.*)\E)).*,但我无法理解它的流程。我理解(?!.*\Q(.*)\E) 部分,但其他部分对我来说仍然是个谜。特别是?<=,这是一个积极的回顾。它是否从字符串末尾搜索?谁能像我是一个 7 岁的孩子一样向我解释一下——请http://regex101.com/ 没有帮助。

【问题讨论】:

    标签: regex regex-lookarounds


    【解决方案1】:

    RegEx (?<=,(?!.*\Q(.*)\E)).*look-behind 的作用如下:

    1. 从字符串的开头第一个字符开始。
    2. 我们可以匹配我们正在寻找的东西吗? ,(?!.*\Q(.*)\E)
      • 如果我们不能:向前移动一个字符,转到 2. 并再次检查匹配。
      • 如果找到匹配项:捕获所有剩余字符,直到我们找不到任何 .*(或者通常尝试匹配剩余的 RegEx)。

    如需更详尽的解释,请阅读Lookahead and Lookbehind Zero-Length Assertions

    【讨论】:

    • 感谢您的解释。可以使用前瞻解决吗??
    • 最好在另一个stackoverflow问题中问。
    【解决方案2】:

    lookbehind 允许您在实际匹配之前指定上下文。

    您可以说 ,(dc=) 并仅返回捕获组,或 ,\Kdc=(?<=,)dc= 以返回 dc= 上的匹配项,但要求逗号出现在匹配项之前。

    该工具还允许多个后视,因此您可以使用 (?<=a.*)(?<=b.*)c 匹配 c,前提是它在输入中的某处同时出现 ab

    lookbehind 基本上是语法糖,因为您通常可以使用其他一些正则表达式结构来重新表述您的条件。当您有多个未锚定的约束时,它会非常方便,就像在上一个示例中一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      相关资源
      最近更新 更多