8

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

Boost 说(并且似乎与 Wikipedia 一致)扩展的正则表达式不支持反向引用,但 Boost::Regex 将它们作为扩展添加。

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

4

3 回答 3

7

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

OpenGroup Base Specifications Issue 7中给出的不向 ERE 添加反向引用的理由如下:

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

引自:基本原理:基本定义:扩展正则表达式

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

还注意到,RE 中的反向引用对于用户或实施者来说都不是直观的,而且实际上它们比现在更经常引起极度混乱。例如,参见RE-Interpretation: The Dark Corners中给出的示例

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

于 2012-11-13T06:19:08.243 回答
4

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

于 2012-11-12T15:53:12.547 回答
1

根据POSIX.1-2008 标准,只有基本正则表达式支持反向引用。 第 9.3.6 节描述了它们如何在 BRE 中工作。扩展正则表达式部分根本没有提到它们,第 9.5.1 节中的语法词汇约定说反向引用标记仅适用于 BRE。

于 2012-11-12T15:57:51.313 回答