与 boost 正则表达式库的递归匹配
Posted
技术标签:
【中文标题】与 boost 正则表达式库的递归匹配【英文标题】:recursive match with boost regex library 【发布时间】:2015-04-12 22:37:54 【问题描述】:我是 boost 的新手,并试图从下面的字符串中的字段中构造一个向量(它将是持有方向(Y/NO)和计数的对象的向量),但是这个字符串长度是任意的,有人可以建议吗如何将确切的字符串与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> itpattern.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】:我会在这里使用 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
您可以使用正则表达式获得类似的结果,但您需要手动检查和转换子匹配项。
【讨论】:
感谢您的建议,我喜欢这种方法,虽然之前没有使用过这些库以上是关于与 boost 正则表达式库的递归匹配的主要内容,如果未能解决你的问题,请参考以下文章