维基百科 says扩展的正则表达式“放弃了对反向引用的支持”,因此必须使用“基本”正则表达式模式来启用它们。然而,似乎许多实现确实支持扩展正则表达式的反向引用。例如,对于 Ubuntu Precise 上的 gcc 4.6,它们是受支持的。 FreeBSD 实现 seem to仅在基本模式下支持它们。
Boost says (并且似乎同意维基百科)扩展正则表达式不支持反向引用,但 Boost::Regex 将它们添加为扩展。
这是否只是标准中定义不明确的部分,每个实现方式都有不同的解释?
最佳答案
正如其他人已经指出的,很明显 POSIX ERE 不支持反向引用。
在 OpenGroup Base Specifications Issue 7 中给出的不向 ERE 添加反向引用的理由如下:
It was suggested that, in addition to interval expressions, back-references ( '\n' ) should also be added to EREs. This was rejected by the standard developers as likely to decrease consensus.
引自:Rationale: Base Definitions: Extended Regular Expressions
此限制的主要原因是允许将 POSIX ERE 转换为确定性有限自动机 (DFA),事实上,Unix 中 ERE 的原始实现是作为 DFA 完成的。使用 DFA 可以保证实现的性能。与(无限数量的)反向引用的模式匹配是一个 NP-hard 问题,甚至可能是一个 NP-complete 问题。如果为 ERE 提议反向引用,则 POSIX 标准委员会永远无法达成共识,因为这将迫使所有使用原始 Unix 实现的公司将其代码更改为非确定性实现并放弃其性能保证,并且一些这些公司中有委员会成员。
还有人注意到,RE 中的反向引用对于用户或实现者来说都不是直观的,事实上,它们比现在更容易引起极度困惑。例如参见 RE-Interpretation: The Dark Corners 中给出的示例
注意:RE 中的反向引用与 sed 等工具中替换文本中子模式的引用不同。
关于c - 扩展正则表达式是否支持反向引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322996/