【发布时间】:2015-08-21 02:09:33
【问题描述】:
PCRE 正则表达式 /..(?<=(.)\1)/ 无法编译:“后向断言中不允许子模式引用。”有趣的是,它在前瞻中似乎是可以接受的,比如/(?=(.)\1)../,只是在后视中不行。
是否有技术原因导致后向引用不允许专门用于后向引用?
【问题讨论】:
-
反向引用通常不能在后视中使用。虽然,一种解决方法是可能的,
..(?<=(?=(.)\1)) -
我想知道为什么,具体来说。甚至
/..(?<=(.)(?=\1).)/被接受,而/..(?<=(.)\1)/不被接受,这似乎变得更奇怪了。 -
这是因为后视中不允许使用可变长度的子模式。由于反向引用可以有任何长度,因此也不允许在后向引用中使用。对于 pcre,经典的解决方法(如果可能)是使用
\K功能。 -
请注意,在分析模式期间,组 1 中的子模式具有恒定长度这一事实完全被忽略。 (很清楚:反向引用 = 可变长度,仅此而已)
-
@WolfgangKluge .NET 是少数可以做到这一点的语言之一。我还没有听说过任何其他能够做到这一点的“通用”语言。
标签: regex pcre regex-lookarounds