我想解析一个看起来像这样的标记:
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
。我做错了什么?
答案 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