C++11正则表达式无法匹配字符串。

3
我想解析一个看起来像这样的标记:
1111111111111111:1384537090:Gl21j08WWBDUCmzq9JZoOXDzzP8=

我使用了一个正则表达式([0-9]{16}):([0-9]{5,20}):([a-zA-Z0-9\\+/=]{28}),当我尝试时它能够胜任。

然后我用C++尝试:

std::regex regexp(R"(([0-9]{16}):([0-9]{5,20}):([a-zA-Z0-9\\+/=]{28}))", 
     std::regex_constants::basic);
std::smatch match;

if (std::regex_search(stringified, match, regexp)) {
    cout << match[0] << ',' << match[1] << ',' << match[2] << endl;
} else {
    cout << "No matches found" << endl;
}

我在Ubuntu 13.10 x64上使用GCC 4.8.1编译,并使用-std=c++11标志。但是我总是得到No matches found。我做错了什么吗?


1
你必须等待GCC 4.9版本。 - Morwenn
2个回答

2

您正在指定POSIX基本正则表达式,在该格式中,必须转义(){}

我进行了一些更改,成功匹配到了结果:

 int main(int argc, const char * argv[]){
    using std::cout;
    using std::endl;
    std::regex regexp(R"(\([0-9]\{16\}\):\([0-9]\{5,20\}\):\([a-zA-Z0-9\\+/=]\{28\}\))",std::regex_constants::basic);
    std::smatch match;
    std::string stringified = "1111111111111111:1384537090:Gl21j08WWBDUCmzq9JZoOXDzzP8=";
    if (std::regex_search(stringified, match, regexp)) {
        cout << match[1] << "," << match[2] << "," << match[3]<< endl;
    } else {
        cout << "No matches found" << endl;
    }
    return 0;
}

或者您可以使用:

std::regex_constants::extended

如果您使用 std::regex_constants::extended,则不应该转义 (){}

如果您不想使用原始字符串,也可以这样做:

std::regex regexp("([0-9]{16}):([0-9]{5,20}):([a-zA-Z0-9\\\\+/=]{28})",std::regex_constants::extended);

您只需要将\\加倍以正确转义它们。上述正则表达式也适用于默认的正则语法std::regex_constants::ECMAScript

std::regex regexp("([0-9]{16}):([0-9]{5,20}):([a-zA-Z0-9\\\\+/=]{28})");

看起来GCC在GCC 4.9的开发分支中刚刚添加了支持正则表达式的功能。


1
R"(是原始引用的开头序列。第一个(不是正则表达式的一部分。 - jbruni
你关于原始引用的说法是正确的。我已经编辑了我的回复以反映这一点。然而,第一个匹配确实是完整的字符串。你可以运行代码自己看看。 - benjamin
我刚刚尝试了上面的代码(使用basicextended常量)。仍然出现“未找到匹配项”的错误。你用哪个编译器编译的? - Bogdan Kulynych
我在OS X上使用clang/llvm。如果您使用std::regex_constants :: extended,则不应转义(){} - benjamin

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接