首页 > 解决方案 > 解析字符串并填充地图

问题描述

考虑一下:

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;
}      

这对我来说似乎有点生疏。我们可以讨论提取这些信息的其他方法吗?

标签: c++c++11

解决方案


使用正则表达式,您可以这样做:

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();

    // ...
}

演示


推荐阅读