C ++ 11正则表达式与字符串不匹配

时间:2013-11-15 17:52:38

标签: c++ regex c++11

我想解析一个看起来像这样的标记:

1111111111111111:1384537090:Gl21j08WWBDUCmzq9JZoOXDzzP8=

我使用正则表达式([0-9]{16}):([0-9]{5,20}):([a-zA-Z0-9\\+/=]{28}),当我在refiddle上尝试时,它会完成工作。

然后我用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;
}

我使用带有-std=c++11标志的GCC 4.8.1在Ubuntu 13.10 x64上编译它。但我总是No matches found。我做错了什么?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您似乎需要使用“扩展”语法。将regex_constants :: basic更改为regex_constants :: extended,它将匹配。

您需要扩展语法才能执行捕获。

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04