考虑以下C ++代码:
#include <iostream>
#include <regex>
#include <string>
int main()
{
regex_match("'c'", std::regex("'[\x00-\x7F]'"));
std::cout << "Reached!";
}
当我使用clang ++ 8.0.0进行编译时,它在运行时崩溃,并出现以下错误:
libc++abi.dylib: terminating with uncaught exception of type std::__1::regex_error: The expression contained mismatched [ and ].
Abort trap: 6
但是括号错配到多远?我有一个开括号,一个开括号将其关闭。我怎么了?
答案 0 :(得分:1)
正确的答案已经在几个小时前的评论中提到。由于评论者似乎没有回来,因此我将在这里总结一下这一点。
在这里,\x00
只是\0
,它表示C样式字符串的结尾。 regex
是用C样式的字符串构造的,因此构造函数看到的实际上是"'["
而不是所需的"'[\x00-\x7F]'"
。换句话说,C风格的字符串不能包含\0
字符。这解释了为什么图书馆抱怨您的括号不匹配。
由于正则表达式允许直接使用转义,因此可以让构造函数看到字符\x00
。 \
本身需要转义,因此它是"\\x00"
。请注意,在这种情况下,您要向构造函数传递四个字符,而不是一个。与\x7F
相同。
std::regex("'[\\x00-\\x7F]'")
或者,您可以使用原始字符串,因此不必转义反斜杠。
std::regex(R"('[\x00-\x7F]')")