为什么C++ 11支持6种不同的正则表达式语法?

rkj*_*nsn 13 c++ regex std c++11

看来C++ 11支持高达六种不同的正则表达式语法:

  • ECMA-262(ECMAScript)正则表达式(略有修改?)
  • 基本POSIX正则表达式
  • 扩展的POSIX正则表达式
  • awk正则表达式
  • grep正则表达式
  • egrep正则表达式

为什么决定包含这么多选项而不是单一语法?为什么这些特别6?

Pot*_*ter 13

标准化过程完全是实用主义.在标准中包含RE语法是有好处的,只要它正确指定,但丢弃一个没有好处.

排除将使图书馆实施者更容易应用"100%C++ 11兼容"徽章,但谁真正关心?无论如何,没有人应该提出这样的要求,只有无知的PHB会寻找它.库总是有错误,防止达到100%,一个好的库有多余的功能.

请注意,所有包含的语法都是由现有的国际标准指定的.因此,C++委员会需要付出很少的努力.只是§28.13,这是几页长.

如果他们省略了标准化语法,那么不同的标准库实现者将以不同的名称添加它,从而导致不兼容.对于仅由流行的库定义的语法来说,这不太可能发生,其中库实现者将负责C++接口,而不是标准库供应商.


Rob*_*her 5

这包含在TR1 提案中。我将尝试总结。

建立在现有标准的基础上而不是自行制定,这似乎是谨慎的做法。

确定了他们可以建立的两个现有标准:POSIX RE 和 ECMAScript RE。Perl RE 被排除在外,因为它们没有标准化。(有理智的人可能会不同意。)此外,ECMAScript RE 被视为 Perl RE 的一个更简单的子集,它涵盖了最有用(或者可能是最常用)的功能。

在这两者中,POSIX RE 的“最左边最长”实现在重要特性上表现不佳,例如非贪婪重复,并且与当今大多数 RE 引擎的工作方式不一致。

另一方面,ECMAScript RE 缺乏 POSIX RE 的本地化支持。因此,他们扩展了 ECMAScript RE 以包含 POSIX-RE 风格的本地化支持。

POSIX RE 支持作为可选内容包含在内,因为它的行为与 ECMAScript RE 不同,足以证明它是一个标准选项。POSIX 标准带有两种语法:基本语法和扩展语法。awk、grep 和 egrep RE 都只是基本或扩展 POSIX 语法的微不足道的变体,而不是真正独立的语法。

所以:两个标准,三个语法,六个变体。