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

标签 c regex posix

维基百科 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/

相关文章:

c - 验证输入

javascript - 正则表达式 (HTML/Javascript) - 获取所有数字和句号

regex - 此正则表达式替代 “$content =~ s/\n—\n.*?$//s”到底在做什么?

c - 用户级程序应该捕获哪些 "fatal"信号?

shell - ./*/是可移植的吗?

c - 如何创建 IPC(进程间通信)C 程序来创建两个子进程

c - gdb:为 SIGBUS 处理程序设置断点

c - 编译时不在命令行上打印时间

javascript - JS RegExp.test() 不起作用?

c - 写(): Bad file descriptor