使用正则表达式初始化地图

丹尼尔

我正在使用一个非常好的和简单的std::vector<std::string>初始化程序,它接受一个输入字符串和正则表达式。它类似于基本拆分,只是它适用于正则表达式Group1匹配:

static std::vector<std::string> match(const std::string& str, const std::regex& re) {
    return { std::sregex_token_iterator(str.begin(), str.end(), re, 1), std::sregex_token_iterator() };
}

载体的构建如下:

std::string input = "aaa(item0,param0);bbb(item1,param1);cc(item2,param2);";
std::vector<std::string> myVector = match(input, std::regex(R"(\(([^,]*),)"));

这会产生一个包含item0,item1,item2从带有正则表达式的输入字符串提取的向量

在此处输入图片说明

现在我的match函数使用正则表达式的第一组结果,并且(我相信)使用vector的初始化形式:

std::vector<std::string> myVector = { ... };

我想创建一个类似的match函数来构造一个std::map<std::string,std::string>. Map 也有上面的初始化器:

std::map<std::string,std::string> myMap = { {...}, {...} };

我的想法是修改正则表达式以创建更多组结果:

在此处输入图片说明

我想修改上面的match函数,使用修改后的正则表达式 ( \(([^,]*),([^)]*))为我创建一个漂亮的地图,结果与此相同:

std::map<std::string,std::string> myMap = { {"item0", "param0"}, {"item1", "param "}, {"item2", "param2"}, };

我试过什么?

static std::map<std::string, std::string> match(const std::string& str, const std::regex& re) {
    return { std::sregex_token_iterator(str.begin(), str.end(), re, {1,2}), std::sregex_token_iterator() };
}

这个(在向量的情况下)会将Group1Group2结果都放入向量中。但它不能初始化地图。

我怎样才能轻松地做到这一点(使用 是不可能的sregex_token_iterator)?

苏蒂罗

我不知道“轻松”到底是什么意思,所以这里有一个简单的解决方案:

#include <iostream>
#include <regex>
#include <vector>

static std::map<std::string, std::string> match(const std::string& str, const std::regex& re) {
    std::map<std::string, std::string> retVal;
    auto token = std::sregex_token_iterator(str.begin(), str.end(), re, {1,2});
    for (auto it=token++, jt=token; it != std::sregex_token_iterator(); ++it, jt = it++)
        retVal.emplace(*it,*jt);
    return retVal;
}

int main() {
    std::string input = "aaa(item0,param0);bbb(item1,param1);cc(item2,param2);";
    auto myVector = match(input, std::regex(R"(\(([^,]*),([^)]*))"));
    for (const auto& item : myVector)
        std::cout<<item.first<<'\t'<<item.second<<std::endl;
}

您也可以尝试使用boost和自制的通用算法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章