SAS中如何统计正则表达式在文本字符串中的匹配次数
SAS 正则匹配交易记录次数统计方案
PRXMATCH函数仅能返回正则首次匹配的字符位置,无法直接统计单条字符串内的总匹配次数,可通过PRXNEXT函数迭代遍历所有匹配项实现计数,适配单条字符串最多50条交易记录的场景完全无性能问题。
可直接运行的实现代码
DATA Want; Set Transactions; /* 仅在第一条观测进入时编译一次正则,提升运行效率 */ retain regex_id; if _n_ = 1 then regex_id = PRXPARSE("/ R\$ ?\d+/o"); /* 初始化参数:计数初始为0,搜索范围覆盖整个字符串 */ QtdMatch = 0; search_start = 1; search_end = length(String); /* 循环查找所有匹配项 */ call PRXNEXT(regex_id, search_start, search_end, String, match_pos, match_len); do while(match_pos > 0); QtdMatch = QtdMatch + 1; call PRXNEXT(regex_id, search_start, search_end, String, match_pos, match_len); end; keep ID String QtdMatch; RUN;
逻辑说明
- 用
PRXPARSE提前编译正则规则,搭配retain语句和o选项,避免每条观测重复编译正则,处理大批量数据时效率更高 - 每次调用
PRXNEXT会从当前搜索起始位置向后查找匹配,找到匹配后自动将搜索起始位置移动到本次匹配段的末尾,为下一次搜索做准备 - 当返回的匹配位置
match_pos为0时,代表已经遍历完整个字符串,没有更多符合规则的交易记录,退出循环
运行结果校验
代码运行后输出结果完全符合预期:
- ID为1的记录:匹配到1条交易
R$250,QtdMatch取值为1 - ID为2的记录:匹配到
R$ 250、R$ 200共2条交易,QtdMatch取值为2 - ID为3的记录:
R$后无数字,不符合交易规则,QtdMatch取值为0
内容的提问来源于stack exchange,提问作者alexdamado
相关产品推荐
相关产品推荐

