如何解决boost::split_regex生成空令牌并实现令牌压缩?
解决boost::split_regex空令牌压缩问题的思路
方法1:手动过滤空令牌
分割完成后直接清理结果里的空字符串,用STL的erase-remove惯用法就行:
std::vector<std::string> parts; boost::split_regex(parts, input_str, regex_pattern); parts.erase(std::remove_if(parts.begin(), parts.end(), [](const std::string& s) { return s.empty(); }), parts.end());
这种方式简单直接,不用管split_regex的内部逻辑,事后处理所有空令牌。
方法2:调整正则表达式匹配连续分隔符
修改分割用的正则,让它匹配一个或多个连续的分隔符,这样split_regex就不会在连续分隔符之间生成空令牌。比如原来用","分割逗号,改成",+",把连续逗号当作单个分隔符处理。
举个实际例子:
原正则是boost::regex(","),改成boost::regex(",+")后,分割"a,,b"会直接得到["a", "b"],不会出现中间的空字符串。
方法3:用Boost.Regex原生迭代器实现分割
如果split_regex不够灵活,直接用Boost.Regex的sregex_token_iterator来实现带空令牌过滤的分割:
std::vector<std::string> parts; boost::regex re(regex_pattern); boost::sregex_token_iterator it(input_str.begin(), input_str.end(), re, -1); boost::sregex_token_iterator end; for (; it != end; ++it) { if (!it->str().empty()) { parts.push_back(*it); } }
这里指定-1表示提取分隔符之外的部分,再手动跳过空结果,效果和token_compress_on一致。
方法4:查看Boost源码挖隐藏参数
因为split_regex属于未文档化算法,可以直接打开<boost/algorithm/string_regex.hpp>看它的实现,说不定有隐藏的重载版本支持压缩选项。不过这种方法依赖具体Boost版本,升级时要注意兼容性。
内容的提问来源于stack exchange,提问作者Warren Niles
相关产品推荐
相关产品推荐

