2015-04-12 26 views
1

我是新来推动,并试图构建一个载体,(这将是(Y /否)&次数保存方向的物体的向量)从以下字符串中的字段,但此字符串长度会是任意的,可以有人建议我该如何确切的字符串boost::regex &店与之相匹配?递归配以升压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)) { 
     ... 
     ...  
    } 
} 

回答

1

我在这里使用精神:

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 

可以实现与正则表达式类似的结果,但你” d离开做检查和转换子匹配手动工作。

+0

感谢您的建议,我喜欢这种方法,虽然之前没有使用这些库 – Jim