Boost::spirit::qi 解析替代变体

问题描述

我需要用参数 A 和 B 解析字符串。未定义参数的顺序。 IE。字符串可以作为下一个格式之一出现

A="value1",B="value2"
B="value1",A="value2"

您可以在下面看到我的部分代码。但在那段代码中,我只能解析 A="value1",B="value2" 变体。我可以修改代码以一起解析第一个和第二个变体吗? 是的,我可以添加替代条件(“|”)。但是如果我需要解析新的 C 和 D 参数怎么办。

using Iterator = std::string::const_iterator;
qi::rule<Iterator,std::string()> quotedStringParser;
quotedStringParser %= ('"' >> +(qi::char_ - '"') >> '"');

std::string A;
std::string B;
bool isImport = false;

if (!qi::parse(begin(line),end(line),("A=" >> quotedStringParser[px::ref(A) = qi::_1] >> ',' >> "B=" >> quotedStringParser[px::ref(B) = qi::_1]) >> qi::eoi
)) {
    return false;
}

解决方法

由于您希望能够将其扩展到任意数量的参数,因此将其视为以逗号分隔的备选方案列表会更容易,每个备选方案都具有语义操作。这样,您就不必处理所有可能的排列。

(("A=" >> quotedStringParser[px::ref(A) = qi::_1]) | 
 ("B=" >> quotedStringParser[px::ref(B) = qi::_1]) |
 ("C=" >> quotedStringParser[px::ref(C) = qi::_1]) |
 ("D=" >> quotedStringParser[px::ref(D) = qi::_1]) ) % "," >> qi::eoi

然而,这是一个非常宽容的解析器。

  • 可以不设置所有值
  • 可以多次重新分配相同的值。

如果您想保持与之前相同的严格程度,您可以相对轻松地验证后解析。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...