C++ 用于提取键值对的Boost正则表达式

C++ 用于提取键值对的Boost正则表达式,c++,regex,boost,C++,Regex,Boost,计划开发一个实用程序,使用boost和regex提取字符串中的键值对 示例输入字符串可以如下所示 旅行:1.5,汽车保险:3.25 拔牙后应该是什么样子 旅行1.5 汽车保险3.25 有下面的代码,但不知何故,这似乎不是预期的工作 std::map<std::string, std::string> pairs; boost::regex re("(?:(.*?):(.*?),)*(?:(.*?):(.*?))$"); // key - value pair // rea

计划开发一个实用程序,使用boost和regex提取字符串中的键值对

示例输入字符串可以如下所示

旅行:1.5,汽车保险:3.25

拔牙后应该是什么样子

旅行1.5

汽车保险3.25

有下面的代码,但不知何故,这似乎不是预期的工作

 std::map<std::string, std::string> pairs;
  boost::regex re("(?:(.*?):(.*?),)*(?:(.*?):(.*?))$"); // key - value pair

  // read lines from stdin; populate map
  boost::sregex_iterator it(str.begin(), str.end(), re), end;
  for ( ; it != end; ++it){
      pairs[(*it)[1]] = (*it)[2];
  }
std::映射对;
boost::regex re((?:(.*):(.*))*(?:(.*):(.*))$”;//键值对
//从标准文本中读取行;填充地图
sregex_迭代器it(str.begin(),str.end(),re),end;
for(;it!=end;++it){
配对[(*it)[1]]=(*it)[2];
}

这真的不应该那么难。你已经得到了大部分答案,只是处理最后一个逗号的问题<代码>(:,|$)应该可以很好地工作


(?:([^:]+):([^,]+)(?:,|$)+

为什么不先按
拆分,然后按
拆分?否则,一个简单的正则表达式,如
([^:]+):([^,]+)
就足够了,其中第一个反向引用是您的键,第二个是您的值。感谢lindrain,尝试了([^:]+):([^,]+)然后我们得到了类似于“旅行1.5”和“汽车保险3.25”的结果,除了第一个键之外,所有其他键都有',尝试使用正则表达式来纠正问题(?:([^:]+:([^,]+)[,])”,但现在所有键值都按预期提取,但对于最后一个不以“,”分隔符结尾的键值对,则必须向其中一个表达式添加可选逗号。如果使用([^:]+):([^,]+),?则它将在键值列表的末尾使用冗余逗号进行匹配,这可能被视为一个功能。