该正则表达式的括号以什么方式“不匹配”?

时间:2019-05-01 18:38:03

标签: c++ regex

考虑以下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

但是括号错配到多远?我有一个开括号,一个开括号将其关闭。我怎么了?

1 个答案:

答案 0 :(得分:1)

正确的答案已经在几个小时前的评论中提到。由于评论者似乎没有回来,因此我将在这里总结一下这一点。

在这里,\x00只是\0,它表示C样式字符串的结尾。 regex是用C样式的字符串构造的,因此构造函数看到的实际上是"'["而不是所需的"'[\x00-\x7F]'"。换句话说,C风格的字符串不能包含\0字符。这解释了为什么图书馆抱怨您的括号不匹配。

由于正则表达式允许直接使用转义,因此可以让构造函数看到字符\x00\本身需要转义,因此它是"\\x00"。请注意,在这种情况下,您要向构造函数传递四个字符,而不是一个。与\x7F相同。

std::regex("'[\\x00-\\x7F]'")

或者,您可以使用原始字符串,因此不必转义反斜杠。

std::regex(R"('[\x00-\x7F]')")