扩展的正则表达式是否支持反向引用?

时间:2012-11-10 14:41:30

标签: c regex posix

扩展正则表达式的维基百科says“放弃了对后向引用的支持”,因此必须使用“基本”正则表达式模式来启用它们。但是,似乎许多实现支持扩展正则表达式的反向引用。例如,在Ubuntu Precise上使用gcc 4.6,它们是受支持的。 FreeBSD实现seem to仅在基本模式下支持它们。

Boost says(似乎同意维基百科),扩展正则表达式不支持反向引用,但Boost :: Regex将它们作为扩展名添加。

这只是标准中定义不明确的部分,每个实现都会对其进行不同的解释吗?

3 个答案:

答案 0 :(得分:6)

正如其他人已经指出的那样,很明显POSIX ERE不支持反向引用。

OpenGroup 基本规范第7期中给出的不添加对ERE的反向引用的基本原理如下:

  

有人建议,除了区间表达式之外,还应该向ERE添加反向引用('\ n')。这被标准开发者拒绝,可能会降低共识。

引自:Rationale: Base Definitions: Extended Regular Expressions

这种限制的主要原因是允许将POSIX ERE转换为确定性有限自动机(DFA),事实上,Unix中ERE的原始实现是作为DFA完成的。使用DFA可以保证实现的性能。与(无限数量)反向引用的模式匹配是NP难问题,甚至可能是NP完全问题。如果为ERE提出反向引用,就永远无法达成POSIX标准委员会的共识,因为这将迫使所有使用原始Unix实现的公司将其代码更改为非确定性实现并降低其性能保证,并且这些公司中有委员会成员。

还有人指出,RE中的反向引用对于用户或实现者来说都不直观,实际上它们比现在更容易引起极度混淆。例如,参见RE-Interpretation: The Dark Corners

中给出的示例

注意: RE中的反向引用与sed等工具中替换文本中对子模式的引用不同。

答案 1 :(得分:4)

根据IEEE/Open Group standard扩展正则表达式不支持反向引用(第9.5.1节),尽管有几个实际的实现。

答案 2 :(得分:1)

根据POSIX.1-2008 standard,只有Basic Regular Expressions支持反向引用。 Section 9.3.6描述了它们在BRE中的工作原理。扩展正则表达式部分根本没有提及它们,9.5.1节中的Grammar Lexical Conventions表示反向引用令牌仅适用于BRE。