【发布时间】:2020-11-02 16:03:03
【问题描述】:
我的任务是解析带括号的字符串,比如
[foo | bar | foobar],到vector 的std::strings。
在这种情况下,
vector 应该以内容 {"foo" , "bar", "foobar"} 结尾。
这些括号可以嵌套。例如,给定的括号字符串
[[john | doe] | [ bob | dylan]]
会变成{ "[john | doe]" , "[bob | dylan] }"
到目前为止我能做到的最好的事情是
int main(int argc, char ** argv)
{
const std::string input {argv[1]};
std::vector<std::string> res;
qi::phrase_parse(input.cbegin(), input.cend(),
'['
>> *qi::lexeme[ +(qi::char_ - '|') >> '|']
> -qi::lexeme[ +(qi::char_ - ']') >> ']' ],
qi::space ,
res);
for (const auto& v: res)
std::cout << v <<std::endl;
return 0;
}
这对于嵌套的情况非常失败。有人可以指出我正确的方向吗?
注意 #1:嵌套案例可以不止一个。
注意 #2:我欢迎任何更简单的解决方案,即使不使用 Boost Spirit。
【问题讨论】:
-
也许使用堆栈数据结构来跟踪您遇到了多少
[大括号?每次遇到],你就将push_back从最后一个[到最后一个]的子串放入最后一个vector然后出栈。 -
实际上,您能详细解释一下
|和[符号的工作原理吗? -
您的示例正在去除与
|相邻的空格。这是必需的吗?不带空格的|是有效的分隔符吗?
标签: c++ boost-spirit boost-spirit-qi