使用正则表达式初始化地图
Initialize a map with regex
我正在使用一个非常漂亮和简单的 std::vector<std::string>
初始化程序,它接受一个输入字符串和正则表达式。它类似于基本拆分,只是它适用于正则表达式 Group1 matches:
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() };
}
这个(如果是向量)会将 Group1 和 Group2 结果都放入向量中。但是它不能初始化地图。
我怎样才能轻松(sregex_token_iterator
不可能)?
我不知道 'easily' 到底是什么意思,所以简单 解决方案来了:
#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 and homemade generic algorithm。
我正在使用一个非常漂亮和简单的 std::vector<std::string>
初始化程序,它接受一个输入字符串和正则表达式。它类似于基本拆分,只是它适用于正则表达式 Group1 matches:
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() };
}
这个(如果是向量)会将 Group1 和 Group2 结果都放入向量中。但是它不能初始化地图。
我怎样才能轻松(sregex_token_iterator
不可能)?
我不知道 'easily' 到底是什么意思,所以简单 解决方案来了:
#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 and homemade generic algorithm。