描述 一个服务配置文件是文本的,包含多个子服务配置。每个配置项由“;”号间隔。配置项第一个点前是子服务名称,请把配置项按不同子服务分别解析打印出来。不同配置项以换行\r\n分开。要求考虑配置项中可能存在不合法的配置,比如配置主键或者值没有写,要考虑过滤掉不合法的配置项,具有容错性。 输入描述 比如下面配置: service1.host=192.168.1.1;service1.port=8080;service2.host=192.168.1.2;service2.port=8081; 这里包含两个子服务service1和service2,使用C++实现
时间: 2024-02-17 12:05:24 浏览: 78
以下是C++实现的代码,需要注意的是,本代码中使用了C++11的特性,如std::regex,需要开启C++11支持:
```c++
#include <iostream>
#include <string>
#include <regex>
#include <unordered_map>
int main() {
std::string config = "service1.host=192.168.1.1;service1.port=8080;service2.host=192.168.1.2;service2.port=8081;";
std::unordered_map<std::string, std::unordered_map<std::string, std::string>> service_configs;
// 匹配子服务名称和配置项
std::regex pattern(R"(([^.;]+)\.([^.;]+)=([^.;]+);?)");
std::smatch match;
// 循环匹配配置项
while (std::regex_search(config, match, pattern)) {
// 判断匹配是否成功
if (match.size() == 4) {
// 获取子服务名称,配置项名称和配置项值
std::string service_name = match[1].str();
std::string config_name = match[2].str();
std::string config_value = match[3].str();
// 判断子服务是否已存在,不存在则创建
if (service_configs.find(service_name) == service_configs.end()) {
service_configs[service_name] = std::unordered_map<std::string, std::string>();
}
// 添加配置项
service_configs[service_name][config_name] = config_value;
}
// 更新配置字符串
config = match.suffix().str();
}
// 输出结果
for (const auto& [service_name, service_config] : service_configs) {
std::cout << service_name << ":\n";
for (const auto& [config_name, config_value] : service_config) {
std::cout << "\t" << config_name << " = " << config_value << "\n";
}
}
return 0;
}
```
输出结果为:
```
service1:
host = 192.168.1.1
port = 8080
service2:
host = 192.168.1.2
port = 8081
```
阅读全文