regex - PCRE:回溯中不允许反向引用?

标签 regex pcre regex-lookarounds

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

是否有技术原因导致后向引用不允许专门用于后向引用?

最佳答案

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

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

这种尺寸确定为您带来选择:

  • 允许可变大小,则每次后退都需要执行才能跳回
  • 不允许可变大小,那么我们可以直接跳回

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

    我来到了 PCRE 和 Python 的 re 模块。
    我在 PCRE documentation 中没有找到任何其他内容比这个错误代码:

    COMPILATION ERROR CODES
    25: lookbehind assertion is not fixed length



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

    The contained pattern must only match strings of some fixed length, meaning that abc or a|b are allowed, but a* and a{3,4} are not. Group references are not supported even if they match strings of some fixed length.



    我们有罪...如果您愿意,可以尝试Python's regex module ,这似乎支持可变长度的lookbehind。

    关于regex - PCRE:回溯中不允许反向引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678150/

    相关文章:

    javascript - 获取字符串中重复序列的数量

    具有多个否定条件的正则表达式前瞻

    java - 使用正则表达式从字符串中删除特定 XML 标记的所有实例

    regex - 非贪婪的正则表达式不选择最接近的选择

    ruby - 在数字中插入连字符

    php - PHP 中的命名正则表达式反向引用

    c - 在递归函数中使用 libpcre

    c# - 正则表达式来替换之前没有特定单词的单词

    如果未找到,则正则表达式默认值

    regex - Grep/Regex 跨多行固定模式匹配,匹配时有特殊条件