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

使用SAS PRX函数提取特定模式字符串并拆分多匹配项的技术需求

解决SAS文本中特定模式字符串的解析问题

问题分析

你需要从PDF提取的文本变量中解析符合特定规则的字符串,原代码的正则表达式存在以下问题:

  • 匹配YYYYYYYY部分时写死了8个大写字母,未支持数字和长度小于8的情况
  • 仅能捕获第一个匹配项,无法处理文本中多个符合模式的字符串
  • 正则中部分字符写法冗余,且未对.进行转义(.在正则中默认匹配任意字符,不符合固定字符要求)

修正后的正则表达式

根据你的规则,正确的正则表达式应为:

/ABCC[A-Z]{2}\.DEFG hijkj LMNO = [A-Z0-9]{1,8} /o

各部分说明:

  • ABCC:固定前缀
  • [A-Z]{2}:匹配2个大写英文字母(对应规则1的XX)
  • \.:转义后的点号,匹配固定的.(避免匹配任意字符)
  • DEFG hijkj LMNO = :固定中间部分
  • [A-Z0-9]{1,8}:匹配1-8个大写字母或数字(对应规则2的YYYYYYYY)
  • 末尾空格:匹配规则4要求的字符串末尾空格

完整SAS代码(支持多个匹配项)

使用数组存储多个匹配结果,通过prxnext循环捕获所有符合模式的字符串:

data want;
    set have;
    /* 定义数组存储最多10个匹配项,可根据实际需求调整数量 */
    array vars[10] $50 var1-var10;
    length start len 8;
    /* 编译正则表达式 */
    regex = prxparse("/ABCC[A-Z]{2}\.DEFG hijkj LMNO = [A-Z0-9]{1,8} /o");
    /* 初始化起始位置 */
    pos = 1;
    /* 循环查找所有匹配项 */
    do i = 1 to dim(vars) until(pos = 0);
        call prxnext(regex, pos, length(txt), txt, start, len);
        if start > 0 then do;
            vars[i] = substr(txt, start, len);
            pos = start + len;
        end;
        else do;
            vars[i] = "";
            pos = 0;
        end;
    end;
    /* 清理临时变量 */
    drop regex pos start len i;
run;

代码说明:

  • 数组vars:定义多个变量存储每个匹配结果,可根据实际可能的匹配数量调整数组维度
  • prxnext:循环查找下一个匹配项,每次找到后更新起始位置pos,避免重复匹配同一内容
  • 循环终止条件:要么遍历完数组,要么找不到更多匹配项(pos=0)

关键注意事项

  • 必须转义.:否则会匹配任意字符,破坏固定格式的匹配要求
  • 保留末尾空格:严格符合规则4,避免误匹配其他类似但无末尾空格的文本片段
  • 调整数组参数:根据实际数据中可能出现的最大匹配数,修改数组的维度和变量长度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:55:20