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