C++11 中的默认正则表达式引擎是什么?
What's the default regex engine in C++11?
从我的一位<.*?>
同事那里看到了用于剥离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
作为第一个子匹配项。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- C++11 中的默认正则表达式引擎是什么?
- 将脚本语言嵌入游戏引擎中的编程语言的目的是什么?