std :: regex未定义行为

时间:2019-02-26 21:01:06

标签: c++ regex std

有人可以描述std :: regex库的这种行为

string a{"ERROR"};
regex r1{"errOR",0};
cout<<regex_search(a,r1)<<endl;
regex r2{"errOR"};
cout<<regex_search(a,r2)<<endl;
regex r3{"errOR",regex::ECMAScript};
cout<<regex_search(a,r3)<<endl;

cout<<r1.flags()<<endl;
cout<<r2.flags()<<endl;
cout<<r3.flags()<<endl;

提供输出

1
0
0
16
16
16

因此,第一个示例隐式忽略了带有与re,即16的默认构造相对应的标志之和的大小写。 顺便说一下,在std :: regex中没有匹配0值的常量, 但是有regex :: icase == 1;

这是std库的设想行为还是我不应馈入明确不支持的构造函数值?

1 个答案:

答案 0 :(得分:2)

std::regex具有several constructors。其中两个是:

  • explicit basic_regex (const charT* str, flag_type flags = ECMAScript);

  • basic_regex (const charT* str, size_t len, flag_type flags = ECMAScript);

第一个构造函数允许使用以null结尾的正则表达式构造正则表达式 串。第二个构造函数允许使用数组构造正则表达式 字符和数组长度。

行:regex r1{"errOR",0};使用第二行。因此,您没有使用 标记为零,但字符串长度为零。由于regex_search能够 匹配空字符串,则返回true

您可以使用以下方法修改实验以强制使用第一个构造函数:

regex r1{ "errOR", regex_constants::syntax_option_type(0) };

标准规定:

  

syntax_option_type类型的有效值最多应具有以下之一:   语法元素ECMAScript,基本,扩展,awk,grep,egrep,set。   如果未设置语法元素,则默认语法为ECMAScript。

因此,现在它正在使用ECMASScript,并且regex_search返回的值是 false

关于您的最后一个问题,我会尽量不要使用不受支持的 参数,因为标准值还声明了[defns.undefined]:

  

当本国际标准省略时,可能会出现未定义的行为   任何明确的行为定义或程序使用错误的行为   构造或错误的数据。