根据分隔符拆分字符串

时间:2014-11-30 18:11:38

标签: c++ boost

除了[0-9],[A-Z]不区分大小写,我的分隔符可能是任何东西 因此,我想基于动态分隔符分割我的字符串。 我目前正在使用boost,但我也对其他解决方案持开放态度。

我目前使用的代码涉及提升,是这样的:

vector<string> split_;
boost::split(split,line,boost::is_any_of("\t"));

如何调整上述代码以符合我的分隔符标准? 还有其他图书馆可以帮助我实现这个目标吗? 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

谓词可以合并:

        !(
            boost::is_from_range('a','z') || 
            boost::is_from_range('A','Z') || 
            boost::is_from_range('0','9')
         )

这种魔力归功于Boost Lambda库AFAIR。无论如何,你可以使用它:

<强> Live On Coliru

#include <boost/algorithm/string.hpp>
#include <vector>
#include <iostream>

int main() {
    std::vector<std::string> split_;
    std::string line("one;two#three//four five\r\n"
            "six");
    boost::split(split_,line,
            !(
                boost::is_from_range('a','z') || 
                boost::is_from_range('A','Z') || 
                boost::is_from_range('0','9')
             )
            );

    for(auto const& s : split_)
        std::cout << s << "\n";
}

PS。考虑使用正则表达式拆分算法:

Live On Coliru

#include <boost/regex.hpp>
#include <vector>
#include <iostream>

int main()
{
    std::string line("one;two#three//four five\r\n"
            "six");

    boost::regex re("[^a-zA-Z0-9]");
    boost::sregex_token_iterator i(line.begin(), line.end(), re, -1), j;
    std::vector<std::string> split_(i, j);

    for(auto const& s : split_)
        std::cout << s << "\n";
}