2015-09-16 66 views
2

我有超過600個字符的長字符串。我想用「|」替換長度小於200的字邊界。搜索一個長度的單詞邊界並用'|'代替它

我已經使用下面的代碼來做到這一點。但我沒有任何運氣。

data test; 
    length str1 $200; 
    str1 = "N=dddddd dddddd dddddd dddddddddd ddd ddddd dddddddd dd d ,n=,|t:14.2.2-1"; 
run; 

data test1; 
    set test; 
    str01 = prxchange('s/\b/|/', -1, str1); 
    str02 = prxchange('s/(.{20,}?\b).*/|/', -1, str1); 
run; 

我知道第一個將搜索所有單詞邊界,並取代它們「|」,但我認爲第二個會工作。但後來只給了我'''作爲輸出。

我在找的是打破一個長的腳註(超過600個字符)在4行語句中被分解,因爲行不能超過200個字符。所以我會用'|'替換長度不超過200的空間並使用'|'將字符串分解

在此先感謝!

在實時情況下,我有以下情況。

data test; 
    length str1 $200; 
    str1 = "XX XX XXXXX XXXX XXXXXXX XXX XXXXX X XXXXXX XXXXXXX XXXXXXXXX XX XXX XXXXXXXXX XXXXXXXXXXXX'X XXXXXX. XXXX XXXXXXXXX XX XXXXXXXXXX XXXXXXXXXX XXX XXXXXXXX. XXX XXXXXXX XXX XXXX XXXXXXXX XXXXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX XXX XXXXX XXX XX XXXX XX XXXX XXXXXXX XXXXXXXXXX XXXXX XX XXX XXXXX XXX XXX XXXXX XX XXX XXXXXXXXXXX XXX XXXXXXXXXX XXXXX 11112525 65, XX XXXXX XXX XXXXXX XXX XXX XXX. XXXXXXXXXXXX, XXX XXXX XXXXX XXX XXXXX XXXXXXXX XXXX XXX XXXX XXXXXX XXXXXXXX XX "XXXXXXXX XXXXXXXX" XX XXX XXX XXXXXX XXX XXXX XXXXXXXXXXX XX XXXXXXXXXX XXXXX XX XXX XXX XXXXXXX XXXXXX. XXXX XX XX XXXX XXXXXX XXXXX XXXXXXXX XXXXX XXXXXXXX XXX XXXXXX XXXX XXXXXXXXXX XXXXXXXXXX XXX XXX XXXXXXXXXXXX XXXXXXX XXXXXXXXXX XXX XXXXXXXX XXXX. XXXXXXX, XXX XXXXXXX XXX XXXXXX XX "XXXXXXXX XXXXXXX - XX XXX XXXXXXX" XXX XXX XXXXXX XXXXX XXX XXX XXXXXXX XXXX XXXXXXX XXXXXXXXXX XXX XXXXXXXXXX X XXXXXXXXXXX XXXXXXXXXX XX XXXX XXXXX. XXXXXXXXXXX XXXX XXXXXXXXX XXXX XXX XXXXXXX XXX XXXXXXXX X XXXXXXXXXX XXXXXXXXX, X XXXX XXX XXXX XX XXXXXX XXXXX, XXXXXXX XXXX XXXX XXXXXXXX XXXXXX XX XX XXXXXX XX XXXXXXXXX XXXXXX XXXXXXXX XXX XXXXXXXXXX XXXXXXX XX XXXXXXXXXX/XXXXXXXXXX XXX XXXXXXXX XXXXXXXXXX XX XXXXXXXX XXXXXXXX XX XXX XXX XXXXXX XX XXXXXX XXXX XXXX XXX XXX XXXXXXX XXXXXXXXXX XXXXXXXXXX. XXXX, XXX XXXXXXXX XXXXXXXX (XX XXXX XXXXX XXX XXXXXX) XXXX XXXXXXX XX XXX XXX XX XXX "XXXXXXXX XXXXXXXX - XX XXX XXXXXXX/XX XXXXXXXXXX". XXX XXXX XX XXX XXXXXXXXX XXXX XXXX XXXX XX XXXXXXXXX XXXX XX XXXXXXX XX XXXXXX. XXX XXXXXXX XXX XXXXXX XXXX XXX XXXXXXX XXXXXX XXXXXX XX XXX XXXXX XX XXXX XXXX, XXX XXX XXXXX XXXX XX XXXXXX XXXX XX X XXXXXXXXX."; 
run; 

如所建議的,我使用:

data test1; 
    set test; 
    str01 = prxchange('s/(.{200,}?)\b\s*/\1|/', -1, compbl(str1)); 
run; 

但是,它不是在長度小於或等於200個字符在單詞boundry放置管。它放置在200以上的管道上,即表達式正在進入(200以上)而不是後退(在200之前或之後)以放置管道。

請讓我知道我們在正則表達式中缺少的東西。

非常感謝!

+0

@stribizhev感謝您的幫助!兩人都得到了同樣的結果,並且得到了我想要的結果。最近的,因爲它用|替換空格和空間。有沒有辦法除了|之外沒有空間也不應該給| |哪裏已經​​有|。另外,您能否詳細說明您的解決方案是以$ 0還是$ 1做的?我們是否可以進行條件搜索並進行替換,即僅在長度超過200時才進行搜索和替換?再次感謝! –

+0

自從我給出答案後,我刪除了評論。至於** $ 0或$ 1做什麼?**,我想我在下面的答案中澄清了這一點。我現在會更新我的答案。 –

回答

2

's/(.{20,}?\b).*/|/'替換整個字符串沒有換行符(因爲其具有可選.{20,}?.*)中,用替換字符串(\b)1間字的邊界。此外,您使用(...)捕獲文本,但您沒有使用它。您可以使用反向引用來「恢復」替換結果中的捕獲文本。

您需要刪除.*至少和使用替換字符串中反向引用:

str02 = prxchange('s/(.{20,}?\b)/$1|/', -1, str1); 
          ^^^ 

調整在必要時進行限制量詞({20,})的數量。

您也可以擺脫捕獲組,並使用\0作爲反向引用整個匹配的文本:

str02 = prxchange('s/.{20,}?\b/\0|/', -1, str1); 

UPDATE

是有辦法,不能有空格除了|也不應該給|哪裏已經有|

只需使用負向後看(見demo):

.{20,}?\b(?![\w|]) 

我們能否有條件的搜索和替換,即搜索和替換隻有在長度大於200

我們可以,但它會看起來很醜。我建議首先檢查字符串的長度,如果條件滿足,繼續進行更換:

if length(str1) > 200 then 
    str02 = prxchange('s/.{200,}?\b(?![\w|])/\0|/', -1, str1); 

返回引用

你可以閱讀更多關於regex back-references at regular-expressions.info。以下是摘錄:

如果您的正則表達式具有命名或編號的捕獲組,則可以在替換文本中重新插入任何捕獲組所匹配的文本。您的替換文本可以隨意引用多個組,甚至可以多次引用同一組。這使得可以用許多不同的方式重新排列由正則表達式匹配的文本。現在

UPDATE2

,看來你還需要對|雙方 「合併」 的話(刪除空格)。然後,只需使用以下正則表達式:

(.{20,}?)\b\s* 

並替換爲\1|

+0

@ stribizhev當我使用代碼str02 = prxchange('s /。{200,}?\ b(?![\ w |])/ \ 0 | /',-1,str1);我沒有得到整個字符串替換'|'如所須。相反,它提供了「N = dddddd dddddd dddddd | ddddddddddd ddd ddddd | dddddddd dd d,n = | | t |:14.2.2-1」(用空格和一個額外的|在t之後)而不是N = dddddd dddddd dddddd | dddddddddd ddd ddddd | dddddddd dd d,n =,| t:14.2.2-1。 –

+0

有一件事是肯定的:'t:14'之前的'|'已經在那裏了。如果你想擺脫它們,首先刪除所有'|'。要解決第二個問題,請使用'prxchange('s /(。{20,}?)\ b \ s */\ 1 | /',-1,str1);'。結果是'N = dddddd dddddd dddddd | ddddddddddd ddd ddddd | dddddddd dd d,n =,| t |:14.2.2-1'。再次,你不能只刪除現有的,並添加一些新的字符只有1操作。 –

+0

@ stribizhev我在其中一個實時場景中嘗試了這個正則表達式。但| |沒有被放置在200個字符以上。我需要有一個|在200個字符或不超過200長度的字邊界處。你能幫忙解決這種情況嗎? –

相關問題