1

我正在尝试匹配一个看起来像这样的字符串:

/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_-]+)&?)+)$
4

3 回答 3

1

token[0]将包含整个比赛。后续索引为您提供匹配的子标记,这些子标记由表达式中的括号确定(括号中的组称为捕获组(?:...)用于非捕获组)。

在此处记录。复制提供的示例,

#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;
}
于 2013-06-14T14:12:31.500 回答
0

我建议正则表达式是解析 URL 路径的错误工具。我可以建议一个URL 解析库吗?

于 2013-06-14T14:12:50.273 回答
0

您可以尝试使用继续转义\G

^/new-contact\\?|(?>\\G([^=]+)=([^&]+)&?)+
于 2013-06-14T14:39:07.830 回答