C ++ 11似乎支持高达六种不同的正则表达式语法:
为什么决定包含这么多选项而不是单一语法?为什么这些特别的6?
答案 0 :(得分:13)
标准化过程完全是实用主义。在标准中包含RE语法是有好处的,只要它被正确指定,但丢弃一个没有任何好处。
排除将使图书馆实施者更容易应用“100%C ++ 11兼容”徽章,但谁真正关心?无论如何,没有人应该提出这样的要求,只有无知的PHB会寻找它。图书馆总是存在防止达到100%的错误,而且好的图书馆有多余的功能。
请注意,所有包含的语法都是由现有的国际标准指定的。因此,C ++委员会需要付出很少的努力。只是§28.13,这是几页长。
如果他们省略了标准化语法,那么不同的标准库实现者将以不同的名称添加它,从而导致不兼容。对于仅由流行的库定义的语法来说,这不太可能发生,其中库实现者将负责C ++接口,而不是标准库供应商。
答案 1 :(得分:4)
这由TR1 proposal涵盖。我将尝试总结一下。
建立一个现有的标准而不是靠自己的标准来看似乎是明智的。
确定了他们可以构建的两个现有标准:POSIX RE和ECMAScript RE。 Perl RE被排除在外,因为它们没有标准化。 (哪些合理的人可以不同意。)此外,ECMAScript RE被视为Perl RE的一个更简单的子集,它涵盖了最有用的(或者可能是最常用的)特性。
在这两者中,POSIX REs的“最左边最长”的实现并没有很好地发挥重要功能,例如非贪婪重复,并且与大多数RE引擎最近工作的方式不一致。
另一方面,ECMAScript REs缺乏POSIX RE的本地化支持。因此,他们扩展了ECMAScript RE,以包括POSIX-RE风格的本地化支持。
POSIX RE支持作为可选项包含在内,因为它的行为与ECMAScript RE不同,足以证明它是标准选项。 POSIX标准带有两个语法:Basic和extended。 awk,grep和egrep RE对于基本或扩展的POSIX语法都是微不足道的变体,而不是真正独立的语法。
所以:两个标准,三个语法,六个变体。
答案 2 :(得分:0)
我认为因为C ++是一种多平台语言。它制作了各种节目的节目。并且大多数用户希望程序遵循例如OS的惯例。
要解决这些问题,有两种解决方案:
第二个更优雅,因为如果更改一个API的接口,则会出现兼容性问题。
例如POSIX是Unix标准。例如军方的几个客户要求软件公司使他们的程序POSIX兼容。有一个故事,微软工作了几个月,将Windows改为兼容POSIX的操作系统,只能将其卖给海军。