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

如何在XS中获取Perl正则命名捕获的匹配结果?

该操作完全可以实现,具体实现逻辑和方法如下:

  • 正则内嵌入的(?{、(??{代码块执行时,会继承当前匹配的完整上下文,所有Perl正则相关内置变量均处于生效状态,你可以直接在代码块中使用$+{name}获取已完成匹配的命名捕获值,和正则外的调用方式完全一致。
    示例代码如下:
    my $test_str = "order_20240501_001";
    if ($test_str =~ /order_(?<date>\d{8})_(?<id>\d{3})(?{
        # 嵌入代码块内直接访问命名捕获
        print "嵌入代码内获取到的日期:$+{date}, 订单ID:$+{id}\n";
    }) /x) {
        print "正则外部获取到的日期:$+{date}, 订单ID:$+{id}\n";
    }
    
    上述代码运行后,嵌入代码块和正则外部打印的捕获值完全一致。
  • 如果你需要在调用的C代码(通常是XS实现的函数)中获取命名捕获,可以通过Perl提供的C API直接访问%+哈希的对应键值,示例C代码片段如下:
    #include "EXTERN.h"
    #include "perl.h"
    #include "XSUB.h"
    
    SV* get_named_capture(const char* capture_name) {
        char sv_name[256];
        // 构造对应Perl变量名,格式为+{捕获名}
        snprintf(sv_name, sizeof(sv_name), "+{%s}", capture_name);
        // 从Perl上下文获取对应标量
        SV* capture_val = get_sv(sv_name, 0);
        // 返回值拷贝避免后续上下文销毁导致值失效
        return capture_val ? newSVsv(capture_val) : &PL_sv_undef;
    }
    
    你在(?{代码块中调用上述XS实现的get_named_capture函数,传入捕获组名称即可拿到对应捕获值。

注意事项:只有已经完成匹配的命名捕获组才会被存入%+哈希,如果你在(??{动态生成正则的场景下访问还未完成匹配的捕获组,将无法拿到有效值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:06:03