【发布时间】:2017-04-06 02:01:37
【问题描述】:
我试图了解正则表达式引擎处理带有后续前瞻性语句的表达式的方式。我觉得我可以用两个例子(javascript 语法)来最好地说明我的问题。如果我不使用术语,请原谅我。
没有前瞻的例子:
/a(.*b)(.*c)/
这将匹配一个包含a 的表达式,该表达式在某个时间点后面跟着一个b,在某个时间点后面跟着一个c。所以第二个原子组(.*c)“适用”到第一个原子组(.*b)。 abc 将满足此表达式,但 acb 不会。
前瞻示例:
/a(?=.*b)(?=.*c)/ == /a(?=.*c)(?=.*b)/
这将匹配一个a,如果它在某个点后面跟着一个b并且它也在某个点后面跟着一个c。所以这两个原子组都适用于a 字符,无论顺序如何:a 将在abc 和acb 中匹配。
所以我猜想,正则表达式引擎对待前瞻(和后瞻?)组的处理方式与对待其他组的方式不同——每次遇到前瞻后,它们是否会返回“主”表达式(在这种情况下为a)?
提前感谢您的帮助。
【问题讨论】:
-
是的。前瞻是“零宽度断言”;它们可能导致匹配失败,但实际上不匹配任何内容。
标签: javascript regex regex-lookarounds