我正在尝试匹配一个看起来像的字符串:
/new-contact?id=nb&name=test
或/new-contact?id=nb
基本上参数的数量是未定义的。
所以我试过这个正则表达式:
boost::regex re("^/new-contact\\?(([a-zA-Z0-9_-]+)=([a-zA-Z0-9_-]+)&?)+$");
但是当我尝试使用以下函数的re时:
function test()
{
std::string input("/new-contact?id=5&name=Test");
boost:cmatch token;
boost::regex_match(req.c_str(), token, input);
std::cout << token[1] << std::endl;
}
我得到了
output: name=Test
如果我将输入字符串更改为
std::string input("/new-contact?id=5&");
我得到了
output: id=5
我想我只是得到了最后一个令牌,但我想用最后一个“+”来获取所有内容?
我错过了什么?
现在正在使用:
^/new-contact\\?((([a-zA-Z0-9_-]+)=([a-zA-Z0-9_-]+)&?)+)$
答案 0 :(得分:1)
token[0]
将包含整场比赛。后续索引为您提供匹配的子标记,这些子标记由表达式中的括号确定(括号组称为捕获组;对非捕获组使用(?:...)
。)< / p>
记录在案here。复制提供的示例,
#include <stdlib.h>
#include <boost/regex.hpp>
#include <string>
#include <iostream>
using namespace boost;
regex expression("([0-9]+)(\\-| |$)(.*)");
// process_ftp:
// on success returns the ftp response code, and fills
// msg with the ftp response message.
int process_ftp(const char* response, std::string* msg)
{
cmatch what;
if(regex_match(response, what, expression))
{
// what[0] contains the whole string
// what[1] contains the response code
// what[2] contains the separator character
// what[3] contains the text message.
if(msg)
msg->assign(what[3].first, what[3].second);
return std::atoi(what[1].first);
}
// failure did not match
if(msg)
msg->erase();
return -1;
}
答案 1 :(得分:0)
我建议正则表达式是解析URL路径的错误工具。我可以建议URL parsing library吗?
答案 2 :(得分:0)
您可以尝试使用延续转义\G
:
^/new-contact\\?|(?>\\G([^=]+)=([^&]+)&?)+