正規表現 "start :(?0-9] {1,2})?([0-9]。*)"があるとします。ブースト::スピリット::気パーサーを書く方法正規表現では?
それは我々はまた、それぞれ2マッチした文字列を取得することができます
std::string string1 = "start: 01 0ab";
と
std::string string2 = "start: 0ab";
と一致します。
私はboost :: spirit :: qiパーサーを使用してstring2を解析しようとしましたが、一致できませんでした。
qi::rule<std::string::const_iterator, std::string()> rule1 = qi::repeat(1,2)[qi::digit];
qi::rule<std::string::const_iterator, std::string()> rule2 = qi::digit >> *qi::char_;
std::vector<std::string> attr;
auto it_begin = string2.begin();
auto it_end = string2.end();
if (qi::parse(
it_begin,
it_end,
qi::lit("start:")
>> -(qi::lit(" ") >> rule1)
>> qi::lit(" ") >> rule2
>> qi::eoi,
attr))
std::cout<<"match"<<std::endl;
else
std::cout<<"not match"<<std::endl;
私たちは、もちろんルール1の背後に何があるかチェックするために先読み演算子を使用できますが、正規表現演算子を実装するためのより一般的なアプローチがあります「?」 ?ありがとう!