SAS中如何从下划线分隔的变量中精确匹配指定片段值
SAS下划线分隔片段精确匹配实现方案
核心需求说明
你需要匹配下划线分隔的独立片段值1122,不匹配长值中包含的子串,有两种常用实现方案:
方案1:正则匹配(最简洁)
使用SAS内置的PRXMATCH正则匹配函数,通过正则限定匹配边界,可直接命中独立片段:
- 正则规则
/(^|_)1122(_|$)/说明:- 匹配
1122前为字符串开头或下划线 - 匹配
1122后为字符串结尾或下划线 - 完全排除子串包含的匹配场景
示例代码:
- 匹配
data want; set have; /* have替换为你的原数据集名 */ /* 生成匹配标识列:1=匹配成功,0=匹配失败 */ match_flag = prxmatch('/(^|_)1122(_|$)/', ABC) > 0; /* 若需要直接返回匹配值1122,增加以下语句 */ if match_flag then match_val = '1122'; else match_val = ''; run;
方案2:遍历分隔片段(兼容性更强)
如果对正则不熟悉,可以先拆分所有下划线分隔的片段,逐一比对:
data want; set have; length match_val $8; match_flag = 0; match_val = ''; /* 计算下划线分隔的总片段数 */ seg_count = countw(ABC, '_'); /* 遍历每个片段比对 */ do i = 1 to seg_count; seg = scan(ABC, i, '_'); if seg = '1122' then do; match_flag = 1; match_val = '1122'; leave; /* 匹配成功后跳出循环,提升效率 */ end; end; drop i seg_count seg; /* 删除过程变量 */ run;
原通配符匹配失败原因
通配符%1122%仅能判断字符串是否包含对应子串,无法限定子串的前后边界,因此会误匹配112233这类包含1122的长值,不适合当前场景。
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

