除了[0-9],[A-Z]不区分大小写,我的分隔符可能是任何东西 因此,我想基于动态分隔符分割我的字符串。 我目前正在使用boost,但我也对其他解决方案持开放态度。
我目前使用的代码涉及提升,是这样的:
vector<string> split_;
boost::split(split,line,boost::is_any_of("\t"));
如何调整上述代码以符合我的分隔符标准? 还有其他图书馆可以帮助我实现这个目标吗? 有什么建议吗?
答案 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";
}