SAS EG开放代码中PRXMATCH函数返回0问题求助
嗨,我来帮你搞定这个问题!
你遇到的问题根源在于宏参数传递时的引号处理:当你在%sysfunc(PRXMATCH(...))里给&ph加上双引号时,宏处理器会把带双引号的整个字符串"FONDS DE BOURSE"传递给PRXMATCH函数——更关键的是,在SAS宏环境中,带空格的字符串被引号包裹后,容易被错误拆分,导致PRXMATCH实际只接收到了字符串的前半部分(比如"FONDS),自然匹配不到bourse,返回0。
解决这个问题很简单,你有几种可选方案:
方案1:去掉多余的双引号
直接传递宏变量的值,不需要额外加引号,宏处理器会把整个带空格的字符串作为单个参数传递给PRXMATCH:
%let ph=FONDS DE BOURSE; %LET A=%sysfunc(PRXMATCH("/bourse/i",&ph)); %put &A;
方案2:用%quote()包裹宏变量(更稳妥)
如果宏变量的值可能包含特殊字符(比如逗号),用%quote()包裹可以确保整个字符串被正确识别为一个参数:
%let ph=FONDS DE BOURSE; %LET A=%sysfunc(PRXMATCH("/bourse/i",%quote(&ph))); %put &A;
方案3:先编译正则表达式(推荐用于复杂场景)
先通过PRXPARSE编译正则表达式得到模式ID,再用PRXMATCH匹配,这种方式在宏环境中更稳定:
%let re = %sysfunc(prxparse("/bourse/i")); %let ph=FONDS DE BOURSE; %LET A=%sysfunc(PRXMATCH(&re,&ph)); %put &A;
执行以上任意一种方案,&A都会返回10(也就是BOURSE在字符串中的起始位置),而不是0啦。
内容的提问来源于stack exchange,提问作者D. O.
相关产品推荐
相关产品推荐

