2015-05-21 135 views
0

%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

爲什麼性能是一個問題呢?如果你正在用這麼多的宏變量來做這件事,那麼你可能會注意到一個數據步驟方法值得考慮的問題呢? – user667489

+0

不是一個問題。只是好奇處理這種事情的有效方法。 – Lovnlust

回答

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

希望得到這個幫助。謝謝!!

UPDATE:

提供更新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))); 
+0

請注意,最後一個不等於前兩個。因爲你用'__'替換'!!',而不是'_'。 – Lovnlust