PCRE正则表达式
/..(?<=(.)\1)/
无法编译:“在反向引用断言中不允许使用子模式引用。”有趣的是,在前瞻中似乎是可以接受的,例如/(?=(.)\1)../
,但不适用于后瞻。是否有技术原因导致只有后瞻不允许使用反向引用?/..(?<=(.)\1)/
无法编译:“在反向引用断言中不允许使用子模式引用。”有趣的是,在前瞻中似乎是可以接受的,例如/(?=(.)\1)../
,但不适用于后瞻。是否有技术原因导致只有后瞻不允许使用反向引用?回顾断言并不完全支持PCRE规则。具体来说,当正则表达式引擎到达回顾断言时,它会尝试确定其大小,然后跳回检查匹配项。
这个大小决定让你做出选择:
由于第一种解决方案对我们(用户)来说是最好的,但显然是最慢和最难开发的。因此,对于PCRE正则表达式,他们决定使用第二种解决方案。例如,Java正则表达式引擎允许半变量回顾:您只需要确定最大大小。
我来到了PCRE和Python的re模块。
我在PCRE文档中没有找到其他内容,只有这个错误代码:
COMPILATION ERROR CODES
25: lookbehind assertion is not fixed length
但在这种情况下,回顾断言是固定长度。
现在,我们可以在re文档中找到以下内容:
包含的模式必须仅匹配某些固定长度的字符串,这意味着允许abc或a|b,但不允许a*和a{3,4}。即使匹配某些固定长度的字符串,也不支持组引用。
我们找到了罪犯......如果您想尝试Python的regex模块,它似乎支持可变长度的lookbehind。
/..(?<=(.)(?=\1).)/
被接受,而/..(?<=(.)\1)/
则不被接受。 - Connor Smith\K
功能。 - Casimir et Hippolyte(?<=(.)(?=\1).)
能够工作是因为回溯引用被包含在一个零宽断言(前瞻)中,所以后顾表达式中子模式的长度是固定的。 - Casimir et Hippolyte