奇怪的std :: wregex行为

时间:2013-08-03 10:47:48

标签: c++ regex c++11

我一直坚持这个奇怪的标准:wregex行为:

^(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$

使用

引发异常
e.code() == regex_constants::error_brack

奇怪的是,我一直在使用在线ECMAScript正则表达式验证器进行测试,没有任何麻烦。事实上,删除第一对括号如下。

^(?:(?:\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$

实际上解决了这个问题,没有特别考虑括号不匹配。

有人对这种行为有解释吗?

编辑:

似乎即使L“[^ \ u0000- \ u001f]”也不起作用。

编辑:

我在编译和执行时运行了一个示例,没有注意到它使用了GCC。此外,事实上MVSC似乎是在GCC给我一个运行时错误(例外)时。

1 个答案:

答案 0 :(得分:1)

我知道这个帖子真的很老,但有人可能会从答案中受益。

问题是正则表达式字符串null中的\u0000,编译器将其解释为字符串的结尾。

正则表达式字符串应声明为raw,例如R"(some regex string)"。 这将解决正则表达式中的任何null问题。