PCRE:在后视镜中不允许反向引用?

Con*_*ith 7 regex pcre regex-lookarounds

PCRE正则表达式/..(?<=(.)\1)/无法编译:"在后观断言中不允许使用子模式引用." 有趣的是,它似乎在前瞻中是可以接受的,例如/(?=(.)\1)../,不是在后视镜中.

是否存在技术上的原因,为什么特别是在后视镜中不允许反向引用?

zes*_*ssx 3

使用 Python 的 re 模块,lookbehind 不支持组引用,即使它们匹配某个固定长度的字符串。


Lookbehinds 不完全支持 PCRE 规则。具体来说,当正则表达式引擎达到向后查找时,它将尝试确定其大小,然后跳回检查匹配。

这个尺寸的确定给您带来了一个选择:

  • 允许可变大小,那么每次回溯都需要在跳回之前执行
  • 不允许可变大小,那么我们可以直接跳回来

由于第一个解决方案对我们(用户)来说是最好的,因此它显然是最慢且最难开发的。因此,对于 PCRE 正则表达式,他们决定使用第二种解决方案。另一个例子是,Java 正则表达式引擎允许半变量lookbehinds:您只需要确定最大大小。


我来到了PCRE和Python的re模块。除了此错误代码之外,我在PCRE 文档
中没有找到任何其他内容:

编译错误代码
25:lookbehind 断言的长度不固定

但在这种情况下,后向断言固定长度的。现在,我们可以在重新文档
中找到以下内容:

包含的模式必须仅匹配某个固定长度的字符串,这意味着允许使用 abc 或 a|b,但不允许使用 a* 和 a{3,4}。即使组引用匹配某个固定长度的字符串,也不支持组引用。

我们有罪...如果你愿意,你可以尝试Python的正则表达式模块,它似乎支持可变长度lookbehind。