Search/replace 宏变量中有特殊字符

Search/replace with special characters in macro variable

%let st1 = a b c;

我想做一个search/replace来得到一个像这样的新宏变量

%let st2 = a_b_c;

%let st3 = a%b%c;

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

基本上只是将某些字符 </code> 替换为 <code>_%!!.

我认为 prxchange 是最快的方式(甚至比 tranwrd 更快)。但我正在为它的语法而苦苦挣扎。

这是我尝试过的

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

正则表达式需要一些改进。我已经根据您的要求更改了正则表达式,即! _ % 需要 space.

更新
%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 函数来替换!!与单个 space。此外,替换从左到右发生。我们不能让它从右到左。

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