正则表达式正面观察如何运作?

时间:2014-02-19 05:19:05

标签: regex regex-lookarounds

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

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

解决方案是(?<=,(?!.*\Q(.*)\E)).*,但我无法理解它的流程。我理解(?!.*\Q(.*)\E)部分,但其他对我来说仍然是个谜。特别是?<=,这是一个积极的后顾之忧。它是从字符串的末尾搜索的吗?任何人都可以向我解释,就像我是一个7岁的孩子 - 请http://regex101.com/没有帮助。

2 个答案:

答案 0 :(得分:2)

RegEx (?<=,(?!.*\Q(.*)\E)).*后视魔药就是这样的:

  1. 从第一个字符的字符串的开头开始。
  2. 我们可以匹配我们正在寻找的东西吗? ,(?!.*\Q(.*)\E)
    • 如果我们无法:向前移动一个字符,转到2. 并再次检查匹配。
    • 如果找到匹配项:捕获所有剩余的字符,直到我们找不到任何.*(或者通常尝试匹配剩余的RegEx)。
  3. 为了更加含糊地解释,请考虑阅读Lookahead and Lookbehind Zero-Length Assertions

答案 1 :(得分:0)

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

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

该工具还允许多个lookbehinds,因此只有在输入中某处(?<=a.*)(?<=b.*)cc之前,您才可以a匹配b

后视基本上是语法糖,因为你通常可以使用其他一些正则表达式构造来改写你的条件。当你有多个非锚定约束时,它可以非常方便,就像在上一个例子中那样