有人可以描述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库的设想行为还是我不应馈入明确不支持的构造函数值?
答案 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]:
当本国际标准省略时,可能会出现未定义的行为 任何明确的行为定义或程序使用错误的行为 构造或错误的数据。