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

2024-01-15

维基百科says http://en.wikipedia.org/wiki/Regular_expression扩展的正则表达式“放弃了对反向引用的支持”,因此必须使用“基本”正则表达式模式来启用它们。然而,似乎有一些实现do支持扩展正则表达式的反向引用。例如,Ubuntu Precise 上的 gcc 4.6 就支持它们。 FreeBSD 实现seem to http://www.manpagez.com/man/7/re_format/仅在基本模式下支持它们。

升压说 http://www.boost.org/doc/libs/1_52_0/libs/regex/doc/html/boost_regex/syntax/basic_extended.html(并且似乎同意维基百科)扩展正则表达式不支持反向引用,但 Boost::Regex 将它们添加为扩展。

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


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

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

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

引用自:基本原理:基本定义:扩展正则表达式 http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html

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

人们还注意到,RE 中的反向引用对于用户或实现者来说都不直观,而且实际上它们比现在更频繁地造成极大的混乱。例如,请参见中给出的示例重新解读:黑暗角落 http://public.research.att.com/~gsf/testregex/re-interpretation.html#The%20Dark%20Corners

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐