我是新手,要尝试从下面的字符串字段中构造一个 vector (它是持有方向(Y / NO)和计数的对象的 vector ),但是此字符串的长度是任意的,有人可以建议我将确切的字符串与boost::regex
匹配并存储它?
std::string str = "Y-10,NO-3,NO-4,Y-100"
编辑:
这是我所做的,但不确定是否最佳?
boost::regex expr{"((Y|NO)-\\d+)"};
boost::regex_token_iterator<std::string::iterator> it{pattern.begin(), pattern.end(), expr, 1};
boost::regex_token_iterator<std::string::iterator> end;
while (it != end) {
std::string pat = *it;
boost::regex sub_expr {"(Y|NO)-(\\d+)"};
boost::smatch match;
if (boost::regex_search(pat, match, sub_expr)) {
...
...
}
}
最佳答案
我在这里使用Spirit:
Live On Coliru
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
enum class YNO { NO, Y };
struct YNoToken : qi::symbols<char, YNO> {
YNoToken() { add("Y", YNO::Y)("NO", YNO::NO); }
} static YNo;
int main() {
std::string const str = "Y-10,NO-3,NO-4,Y-100";
auto f = str.begin(), l = str.end();
std::vector<std::pair<YNO, int> > v;
bool ok = qi::parse(f, l, (YNo >> '-' >> qi::int_) % ',', v);
if (ok) {
std::cout << "Parse success: \n";
for (auto pair : v)
std::cout << (pair.first==YNO::Y? "Y":"NO") << "\t" << pair.second << "\n";
}
else
std::cout << "Parse failed\n";
if (f!=l)
std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
}
版画
Parse success:
Y 10
NO 3
NO 4
Y 100
使用regex可以达到类似的结果,但是您将需要手工检查和转换子匹配项。
关于c++ - 与Boost regex库进行递归匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29595465/