2017-02-14 148 views
1

同樣數量之間的數字是否有可能使用數字在此字符串:SAS PRXCHANGE話到空格

「xx8xx」

通過更換與8個空格的數量得到這個字符串:

'xx  xx' 

我可以識別XX但更換語法之間的數量預期不起作用:

PRXCHANGE(s/xx([\d]*)xx/' ' x $1/io, -1, 'xx8xx') 

是否有使用被關押在$ 1號被這個數字重複空格字符類似的東西,即'X $ 1的方式?

任何幫助非常感謝! Tiaan

+0

MMM的第4行中的空格數已減少到1,它應該是8個空格>< – Tiaan

+1

在SAS 9,PCRE正則表達式的使用,但即使是不讓你使用像圖案。您無法評估字符串替換部分中的組內容。你需要寫一些代碼。 –

+0

似乎你是正確的,它不能在一個聲明中完成,謝謝你的反饋! – Tiaan

回答

0

認爲你需要三個空白取代。

data _null_; 
    x=prxchange('s/(xx)\d+(xx)/$1 $2/', -1, 'xx8xx'); 
    _x=prxchange('s/(?=\w+)(\d+)/ /',1,'xx8xx'); 
    put _all_; 
run; 

編輯: 我錯過了重要的信息。 Tranwrd和重複可以用來得到它。

data _null_; 
    x=tranwrd('xx8xx', prxchange('s/.*(\d+).*/$1/',1,'xx8xx'), repeat(' ',prxchange('s/.*(\d+).*/$1/',1,'xx8xx'))); 
    put _all_; 
run; 
+0

有趣的解決方案(第二個),它的工作原理(不得不加-1,因爲它創造了9位),我的目的。 X = tranwrd( 'xx8xx',prxchange(的/.*(\ d +)。*/$ 1 /',1 'xx8xx'),重複(」',prxchange(的/.*(\ d + )*/$ 1 /」,1 'xx8xx') - 1)); 謝謝Sheglin! – Tiaan

0

你需要首先提取,然後編譯一個新的正則表達式。這將會很昂貴,因爲你必須每行編譯一次。

data have; 
input xstr $; 
datalines; 
xx8xx 
xx3xx 
xx4xx 
;;;; 
run; 

data want; 
    set have; 
    rx1 = prxparse('/xx([\d])*xx/io'); 
    rc1 = prxmatch(Rx1,xstr); 
    num_x = prxposn(rx1,1,xstr); 

    rx2 = prxparse(cat('s/(xx)[\d]*(xx)/$1',repeat(" ",num_x-1),'$2/i')); 
    newstr = prxchange(rx2,-1,xstr); 
run; 
+0

感謝喬,沒有經過充分測試您的解決方案,因爲它比李盛霖的更詳細一點 – Tiaan