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

时间:2015-06-06 01:50:08

标签: regex pcre regex-lookarounds

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

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

1 个答案:

答案 0 :(得分:3)

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

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

此尺寸确定可让您选择:

  • 允许变量大小,然后在跳回之前需要执行每个lookbehind
  • 禁止变量大小,然后我们可以直接跳回来

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

我来到了PCRE和Python的模块 我在PCRE documentation中找不到任何其他错误代码:

  

编译错误代码

  25:lookbehind断言不是固定长度

但在这种情况下,后方断言固定长度 现在,我们可以在re documentation中找到以下内容:

  

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

我们已经内疚......如果你愿意,你可以尝试Python's regex module ,它似乎支持可变长度的后视。