C++11 中的默认正则表达式引擎是什么?



从我的一位<.*?>同事那里看到了用于剥离HTML标签的正则表达式,对我来说零或一出现零个或多个字符(?.*)对我来说没有意义。此外,它似乎不起作用,因为.*贪婪,所以也会在标签之间剥离数据。

但是在在线正则表达式中对此进行测试时,我的同事似乎是正确的断言,即它使它不贪婪,所以我决定去检查原因。

无论如何,这只是背景。查看 C++11 标准,我终于发现根据28.5.2table 128允许多个可能的正则表达式引擎,并且:

类型syntax_option_type的有效值应恰好具有 元素ECMAScriptbasicextendedawkgrepegrep、集合。

但是,同一部分显示,如果未指定,则使用的默认值match_default定义为零,这显然没有设置其中一个位。

在标准中,我找不到指定默认引擎的位置,所以我想知道这是定义的实现还是我只是错过了它。

好的,根据评论,我更深入地研究了标准和类层次结构是什么。

我相信这在C++11 28.8.2中由basic_regex构造函数涵盖,这些构造函数由更高级别使用。所有这些构造函数,例如:

basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);

使用 ECMAScript 作为默认引擎。


而且,就其价值而言,ECMAScript 语法明确指出了最初促使我进行此任务的.*?行为。当?紧跟在量词(*+?{exact}{min,}{min,max})之后时,它被区别对待(即,不是零或一量词),因为它使匹配不贪婪:

默认情况下,所有这些量词都是贪婪的(即,它们采用尽可能多的满足条件的字符)。通过在量词后添加问号?,可以将此行为覆盖为 ungreedy(即,尽可能少地采用满足条件的字符)。

例如,将"(a+).*""aardvark"匹配成功并生成aa作为第一个子匹配项,而将"(a+?).*"与其匹配也会成功,但生成a作为第一个子匹配项。

最新更新