如何从后往前迭代STL regex匹配结果,有无更优雅的实现方案?
STL 正则迭代器确实属于前向迭代器类别,标准库没有提供直接反向遍历匹配结果的配置参数,以下是两种更优雅的实现方案:
方案1:简化容器存储实现(兼容所有C++11及以上版本)
原实现的while循环可以直接用迭代器范围初始化容器省略,大幅减少冗余代码:
std::string iterateRegexFromEnd(std::string s) { const std::regex expression("\\w+"); const std::sregex_iterator itend; std::sregex_iterator iterator(s.begin(), s.end(), expression); // 直接用迭代器范围构造vector,不需要手写循环push_back const std::vector<std::string> matches(iterator, itend); // 反向遍历输出 for (auto it = matches.rbegin(); it != matches.rend(); ++it) { if (it != matches.rbegin()) std::cout << ", "; std::cout << *it; } std::cout << std::endl; }
这种实现逻辑清晰易维护,是大多数场景下的最优选择。
方案2:使用反向迭代器构造正则迭代器(无需预先存储所有匹配结果)
如果不想额外存储所有匹配结果,可以直接传入字符串的反向迭代器构造正则迭代器,匹配结果天然就是从原字符串末尾到开头的顺序,仅需要对每个匹配结果做一次反转即可:
std::string iterateRegexFromEnd(std::string s) { const std::regex expression("\\w+"); const std::sregex_iterator itend; // 传入反向迭代器,从后往前匹配 std::regex_iterator<std::string::reverse_iterator> iterator(s.rbegin(), s.rend(), expression); bool first = true; for (; iterator != itend; ++iterator) { if (!first) std::cout << ", "; first = false; // 反转匹配结果,恢复正常字符串顺序 std::string match = iterator->str(); std::reverse(match.begin(), match.end()); std::cout << match; } std::cout << std::endl; }
这种方案适合匹配结果量级很大、不想占用额外内存存储所有结果的场景。
注:标准库regex没有提供直接修改匹配方向的配置项,以上两种是目前工业界普遍采用的实现方式。
内容的提问来源于stack exchange,提问作者Aleksandr Medvedev
相关产品推荐
相关产品推荐

