使用boost :: split分割带有多个定界符的字符串

时间:2018-12-06 14:49:12

标签: c++ string boost

我有一个要分割的字符串,所以我正在使用boost::split

但是boost::is_any_of接受一个字符串并将每个字符用作分隔符。

我的分隔符应为“->”和“:”

“:”有效,因为它是单个字符定界符,但“->”不起作用(它将每个字符(“-”和“>”分别作为定界符)

std::vector<std::string> strs;
boost::split(strs, line, boost::is_any_of(["->:"]));

如何定义多个分隔符,其中一些不止一个字符?

示例:

"0:c->2"   should give [0,"c",2]

如果其他解决方案更容易解决特定问题,我愿意接受其他不使用boost的解决方案

1 个答案:

答案 0 :(得分:0)

您可以使用Boost.Spirit解析字符串:

#include <string>
#include <vector>
#include <iostream>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

int main()
{
    std::string str = "0:c->2";
    std::vector< std::string > vec;

    auto it = str.begin(), end = str.end();
    bool res = qi::parse(it, end,
        qi::as_string[ *(qi::char_ - ':' - "->") ] % (qi::lit(':') | qi::lit("->")),
        vec);

    std::cout << "Parsed:";
    for (auto const& s : vec)
        std::cout << " \"" << s << "\"";

    std::cout << std::endl;
    return 0;
}

在这里,解析器生成一个与*(qi::char_ - ':' - "->")解析器匹配的字符串列表(解析为“除':'或“->”以外的任何数量的任何字符“),并由与(qi::lit(':') | qi::lit("->"))解析器(读取为“':'字符或“->”字符串”)。第一个解析器必须排除分隔符,否则它们将包含在解析的字符串中。 qi::as_string部分仅将解析的字符转换为std::string属性,然后将其附加到vec序列中。