%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)));
答案 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)));