我读了这篇文章http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html,它讨论了pcre及其与chomsky层次结构的关系。
他讨论了上下文敏感语法,并指出pcre肯定支持一些上下文敏感语言,但不清楚它是否支持所有上下文敏感语言。他继续提供
(?<A> (?<= α ) γ (?= β ) )
作为上下文敏感语法规则可能的音译到pcre中,但注意到lookbehinds不支持变量宽度。暗示似乎是,如果pcre支持可变宽度的lookbehinds,那么pcre可以编码所有上下文敏感语言。
*免责声明:我是一名正则表演爱好者。
这让我想知道是否可以将后视镜转换为前瞻(因为可能前瞻不会受到这种固定宽度限制的影响)。
然后我把这个正则表达式写成了一个可能的上下文敏感语法的替代实现,
(?(?= a) (?: a)(?<A> γ)(?= β))
至于我试过的更具体的案例,
(?(?=ab+)(?:ab+)(?<A>[def]{1,5})(?=xyz))
以及
(?(?=ab+)(?:ab+)([def]{1,5})(?=xyz))
因为我不清楚是否有关于如何进行“A”捕获的要求(它是否需要是最外层的“分组”?)。
这两个正则表达式匹配字符串,如'abbdefxyz',但不匹配'abbadefxyz'和'zdefxyz'等字符串。