使用宏变量

时间:2015-05-21 02:29:16

标签: regex sas

%let st1 = a b c;

我想进行搜索/替换以获得像这样的新宏变量

%let st2 = a_b_c;

%let st3 = a%b%c;

%let st3 = a!!b!!c;

基本上只需将某个字符替换为_%!!

我认为prxchange是最快的方式(甚至比tranwrd更快)。但我正在努力解决它的语法问题。

这是我尝试过的事情

%put %sysfunc(prxchange(s/(\w+)/\1_/,-1,%bquote(&st1)));

1 个答案:

答案 0 :(得分:1)

正则表达式需要一些工作。我根据你的要求更改了正则表达式,即! _%需要按空格更新。

%let st1 = a b c;
%let st2 = a_b_c;
%let st3 = %nrstr(a%b%c);
%let st4 = a!!b!!c;
%put %sysfunc(prxchange(s/[\_\!\%]/ /,-1,%bquote(&st2)));
%put %sysfunc(prxchange(s/[\_\!\%]/ /,-1,%bquote(&st3)));
%put %sysfunc(prxchange(s/[\_\!\%]/ /,-1,%bquote(&st4)));

希望这有帮助。谢谢!

<强>更新

提供更新的prxchange功能来替换!!单一空间。此外,更换从左到右进行。我们无法从右到左做到这一点。

%let st1 = a b c;
%let st2 = a_b_c;
%let st3 = %nrstr(a%b%c);
%let st4 = a!!b!!c;
%put %sysfunc(prxchange(s/([\_\%])|(!!)/ /,-1,%bquote(&st2)));
%put %sysfunc(prxchange(s/([\_\%])|(!!)/ /,-1,%bquote(&st3)));
%put %sysfunc(prxchange(s/([\_\%])|(!!)/ /,-1,%bquote(&st4)));