我一直在从堆栈中解决旧问题,以便我可以提高我的正则表达式知识。由于我对正则表达式有基本的了解,但大多数都很容易,但这个问题regex problem很难。
它要求正则表达式从这种字符串ou=persons,ou=(.*),dc=company,dc=org
中提取最后一个字符串,后面紧跟逗号后面跟(.*)
。在最后一种情况下,这应该是dc=company,dc=org
。
解决方案是(?<=,(?!.*\Q(.*)\E)).*
,但我无法理解它的流程。我理解(?!.*\Q(.*)\E)
部分,但其他对我来说仍然是个谜。特别是?<=
,这是一个积极的后顾之忧。它是从字符串的末尾搜索的吗?任何人都可以向我解释,就像我是一个7岁的孩子 - 请http://regex101.com/没有帮助。
答案 0 :(得分:2)
RegEx (?<=,(?!.*\Q(.*)\E)).*
后视魔药就是这样的:
,(?!.*\Q(.*)\E)
2.
并再次检查匹配。.*
(或者通常尝试匹配剩余的RegEx)。为了更加含糊地解释,请考虑阅读Lookahead and Lookbehind Zero-Length Assertions。
答案 1 :(得分:0)
lookbehind允许您在实际匹配之前指定上下文。
您可以说,(dc=)
并仅返回捕获组,或,\Kdc=
或(?<=,)dc=
以返回dc=
上的匹配,但要求逗号在此之前存在比赛。
该工具还允许多个lookbehinds,因此只有在输入中某处(?<=a.*)(?<=b.*)c
和c
之前,您才可以a
匹配b
。
后视基本上是语法糖,因为你通常可以使用其他一些正则表达式构造来改写你的条件。当你有多个非锚定约束时,它可以非常方便,就像在上一个例子中那样