C++ 奇怪的行为

C++ 奇怪的行为,c++,regex,c++11,C++,Regex,C++11,我一直被这种奇怪的性病折磨着: ^(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\

我一直被这种奇怪的性病折磨着:

^(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$
奇怪的是,我一直在用一个在线ECMAScript正则表达式验证器测试它,没有任何问题。另外,按照以下步骤移除第一对支架

^(?:(?:\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$
本次代码>目前的主要码码码>以下以下几点::::::(以下以下以下?::::::::::::::::::::::::::::::::::::::::::::::::::::::::(::::::\\\\\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \?????????????????????????????????????????????????????????????????らららららららららららららららららららららら12425*$ 实际上解决了这个问题,没有特别考虑到括号不匹配

有人能解释这种行为吗

编辑:

似乎连L“[^\u0000-\u001f]”都不起作用

编辑:


我正在运行一个关于编译和执行的示例,没有注意到它使用了GCC。另外,当GCC给我一个运行时错误(异常)时,MVSC似乎是一个事实。

我知道这个线程非常旧,但是有人可能会从中受益

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

正则表达式字符串应该声明为原始,例如
R“(一些正则表达式字符串)”

这将解决您的正则表达式中的任何
null
问题。

我知道此线程非常旧,但是有人可能会从答案中受益

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

正则表达式字符串应该声明为原始,例如
R“(一些正则表达式字符串)”

这将解决正则表达式中的任何
null
问题。

这并不是说会破坏模式,而是为什么您的字符类包含两个文本反斜杠?(
\\\\\\\\
…在
之前和
/
之后)正则表达式的格式适合于c代码。所以\\\\实际上是\\普通正则表达式。第一个和第三个是c的转义序列,第二个是正则表达式的转义序列。我知道四个反斜杠在模式中构成一个文字反斜杠,但在同一个字符类中有两次四个反斜杠。将反斜杠替换为
b
,这就像编写
[^…:b\“/b\\\\\\\…]
。您是否有可能尝试使用GNU libstdc++?它还不支持正则表达式(即使其中一些已编译)。我可以用它重现您的错误,但不能用LLVM libc++或boost.Regex。上次编辑是什么意思?您在使用gcc时提到了一个异常。在gcc上不起作用,库没有完全实现。这并不是说这会破坏模式,但为什么您的字符类包含两个文字反斜杠?(
\\\\
…在
之前和
/
之后)正则表达式是格式化的,因此它适用于c代码。所以\\\\实际上是\\普通正则表达式。第一个和第三个是c的转义序列,第二个是正则表达式的转义序列。我知道四个反斜杠在模式中构成一个文字反斜杠,但在同一字符类中有四个反斜杠两次。将反斜杠替换为
b
,这就像编写
[^…:b\“/b\\\\|…]
。您是否有可能尝试使用GNU libstdc++?它还不支持正则表达式(即使其中一些是编译的)。我可以用它重现您的错误,但不能用LLVM libc++或boost.regex。上次编辑是什么意思?您在使用gcc时提到了一个异常。在gcc上不起作用,库未完全实现。
^(?:(?:\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*:/)|(?:\\./))(?:(?:[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*\\w+[^\\u0000-\\u001f<>:\\\\\"/\\\\\\|\\?\\*]*/?)|(?:\\./)|(?:\\.\\./))*$