PCRE:反向引用在lookbehinds中是不允许的?

PCRE正则表达式/..(?<=(.)1)/无法编译:“在一个lookbehind断言中不允许子模式引用。” 有趣的是,它似乎可以被视为可接受的,像/(?=(.)1)../ ,而不是在/(?=(.)1)../中。

是否存在技术上的原因,为什么反向引用不能专门用于向后看?


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


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

这个尺寸决定带给你一个选择:

  • 允许可变大小,然后每个lookbehind都需要在跳回之前执行
  • 不允许可变大小,那么我们可以直接跳回来
  • 由于第一种解决方案对我们(用户)来说是最好的,所以它显然是最慢的,也是最难开发的。 对于PCRE正则表达式,他们决定使用第二种解决方案。 作为另一个例子,Java正则表达式引擎允许半变量lookbehinds:您只需确定最大大小。


    我来到PCRE和Python的重新模块。
    我还没有发现PCRE文档中的其他内容,而不是这个错误代码:

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

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

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

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

    链接地址: http://www.djcxy.com/p/26835.html

    上一篇: PCRE: backreferences not allowed in lookbehinds?

    下一篇: Objective C: Exporting Private and Public Key from Keychain