gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:01:34 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com