从我的一位<.*?>
同事那里看到了用于剥离HTML标签的正则表达式,对我来说零或一出现零个或多个字符(?
.*
)对我来说没有意义。此外,它似乎不起作用,因为.*
贪婪,所以也会在标签之间剥离数据。
但是在在线正则表达式中对此进行测试时,我的同事似乎是正确的断言,即它使它不贪婪,所以我决定去检查原因。
无论如何,这只是背景。查看 C++11 标准,我终于发现根据28.5.2
和table 128
允许多个可能的正则表达式引擎,并且:
类型
syntax_option_type
的有效值应恰好具有 元素ECMAScript
、basic
、extended
、awk
、grep
、egrep
、集合。
但是,同一部分显示,如果未指定,则使用的默认值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
作为第一个子匹配项。