You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用RE2::PartialMatch获取动态数量捕获组的所有匹配结果

RE2动态捕获组匹配实现方案

RE2原生支持动态数量捕获组的结果接收,不需要硬编码固定数量的字符串接收变量,核心是使用N后缀的底层匹配接口搭配RE2::Arg类型参数列表实现,和预期的调用逻辑完全一致。

具体实现方法

  • 先通过正则对象的NumberOfCapturingGroups()方法获取当前正则的捕获组总数量,按需创建存储结果的std::vector<std::string>容器。
  • 创建RE2::Arg类型数组,将数组内每个元素绑定到结果vector对应位置的字符串地址。
  • 创建RE2::Arg*类型的指针数组,存储每个Arg对象的地址,传入RE2::PartialMatchN接口完成匹配。

可直接复用的实现示例:

#include <vector>
#include <string>
#include <re2/re2.h>

std::vector<std::string> MatchDynamicCaptureGroups(const std::string& text, const RE2& reg) {
    int group_cnt = reg.NumberOfCapturingGroups();
    std::vector<std::string> match_results(group_cnt);
    std::vector<RE2::Arg> args(group_cnt);
    std::vector<RE2::Arg*> arg_ptrs(group_cnt);

    for (int i = 0; i < group_cnt; ++i) {
        args[i] = &match_results[i];
        arg_ptrs[i] = &args[i];
    }

    bool is_matched = RE2::PartialMatchN(
        text, 
        reg, 
        arg_ptrs.data(), 
        group_cnt
    );

    return is_matched ? match_results : std::vector<std::string>{};
}

注意事项

  • 如果需要获取正则整体匹配的完整字符串(即0号捕获组),只需要将容器、Arg数组、Arg指针数组的长度设置为group_cnt + 1,循环从下标0开始绑定地址即可。
  • 除了PartialMatchN,RE2还提供了同逻辑的FullMatchN、FindAndConsumeN接口,分别对应全匹配、消费式匹配的动态参数场景,调用方式完全一致。
  • 日常使用的固定参数变参版本RE2::PartialMatch本质是上层封装的语法糖,内部最终也是调用N后缀的底层接口,因此上述方案是官方支持的标准用法,不存在兼容性问题。

内容的提问来源于stack exchange,提问作者davdsb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:42:27