c++ - 解析字符串并填充地图
问题描述
考虑一下:
command1 -keep -path { {path1} } { {./input.doc} }
我想解析上面的行并将信息收集到一个映射中,其中 value 将是 -path 选项的内容,而 key 将是其他所有内容。字符串的格式将被固定,在 -path 之后会有两个左括号和两个右括号。在这种情况下,
关键是:
command1 -keep { {./input.doc} }
价值将是:
path1
我正在使用蛮力方法进行操作,如下所示:
获取 -path 的位置。
获取第二个右括号的位置。
更多处理并创建 -path 的两个子字符串,其余具有上述两个位置。像这样:
#include<iostream>
#include<cstring>
int main() {
std::string s1 = "command1 -keep -path { {path1} } { {./input.doc} }";
std::size_t found = s1.find("-path");
std::size_t closeBracesPos = s1.find_first_of("}",s1.find_first_of("}")+1);
std::string preS1 = s1.substr(0, found);
std::string postS1 = s1.substr(closeBracesPos+1);
std::string pathStr = s1.substr(found+1, s1.size() - preS1.size() - postS1.size());
std::size_t pathStrOpeningBracePos = pathStr.find_last_of("{");
std::size_t pathStrClosingBracePos = pathStr.find_first_of("}");
std::string pathStrOpeningBrace = pathStr.substr(0, pathStrOpeningBracePos);
std::string pathStrClosingBrace = pathStr.substr(pathStrClosingBracePos);
std::string pathNames = pathStr.substr(pathStrOpeningBracePos+1, pathStr.size()-pathStrOpeningBrace.size()-pathStrClosingBrace.size()-1);
std::string remainingStr = preS1 + " " + postS1;
std::cout << "PATH NAMES :" << pathNames << std::endl;
std::cout << "Remaining :" << remainingStr << std::endl;
}
这对我来说似乎有点生疏。我们可以讨论提取这些信息的其他方法吗?
解决方案
使用正则表达式,您可以这样做:
std::string s1 = "command1 -keep -path { {path1} } { {./input.doc} }";
std::regex pattern{R"((.*)-path \{ \{([^}]*)\} \}(.*))"};
std::smatch obj;
if (std::regex_match(s1, obj, pattern))
{
std::string key = obj[1].str() + obj[3].str();
std::string value = obj[2].str();
// ...
}
推荐阅读
- c# - DataContract 在没有 DataContractAttribute 的情况下工作(直到混淆)
- javascript - Sequelize JS如何处理验证
- reactjs - 如何从 react redux 组件中删除 cookie?
- java - GirdBagLayout 混乱
- javascript - 一种在另一个 html 中使用对象标签显示网页而不使用 jquery 的更好方法,只是普通的 javascript
- php - 获取两个日期之间的出现次数/次数
- node.js - 在 NodeJs 中使用 findOne() 时出现 UnhandledPromiseRejectionWarning
- react-native - 存储来自 api 调用 React native 的结果
- python - 遍历字典中的函数
- ms-access - 在子表单中级联组合框