こういう文字列の
abc(123)
123を取り出す。
#include <iostream> #include <boost/spirit/include/qi.hpp> #include <boost/fusion/include/vector.hpp> int main() { namespace qi = boost::spirit::qi; typedef boost::fusion::vector<std::string, std::string> value_type; typedef qi::rule<std::string::const_iterator, value_type()> rule_type; const rule_type r = *(qi::char_ - '(') >> '(' >> *(qi::char_ - ')') >> ')'; const std::string s = "abc(123)"; value_type result; if (!qi::parse(s.begin(), s.end(), r, result)) { std::cout << "failed" << std::endl; return 1; } std::cout << boost::fusion::at_c<0>(result) << std::endl << boost::fusion::at_c<1>(result) << std::endl; }
abc 123
取り出せたけど、abcがいらない。
tupleのignoreみたいなことをQiの方でやりたいんだけど、どうればいいんだろう。
追記:
qi:omit[]ディレクティブで解決しました。
@yuttieyuttieさんありがとうございます!
#include <iostream> #include <boost/spirit/include/qi.hpp> int main() { namespace qi = boost::spirit::qi; typedef std::string value_type; typedef qi::rule<std::string::const_iterator, value_type()> rule_type; const rule_type r = qi::omit[*(qi::char_ - '(')] >> '(' >> *(qi::char_ - ')') >> ')'; const std::string s = "abc(123)"; value_type result; if (!qi::parse(s.begin(), s.end(), r, result)) { std::cout << "failed" << std::endl; return 1; } std::cout << result << std::endl; }
123