2016-01-20 70 views
1

我有一個包含某些控制字符的轉義字符串。 控制字符是ACK,STX類型。 參考:http://ascii.cl/control-characters.htm正則表達式替換逃逸字符串中的模式控制字符

我需要用~替換所有的控制字符,最好是所有連續的控制字符。

Ex。輸入

%00%00%00%02THE%20QUICK%BROWN%00%00%00%0D%00%00%00%0FFOX%20JUMPED%00%00%00%0EOVER%20THE%00%00%4E%02LAZY%20DOG 

我的期望輸出應該是:

~THE%20QUICK%20BROWN~FOX%20JUMPED~OVER%20THE~LAZY%20DOG 

爲自己和他人着想的方法,我尋找的是,以取代在這種情況下會像%0?%0?%0?%0的模式?這意味着任何可能蔓延到文本中的東西。

的字符串模式

  1. 字符串應該是長度的12

  2. 字符串應含有4個零符號EX。 %0

我也接受其他建議。

意圖是擺脫字符串中的所有控制字符。替換~只是爲了保留一個選項卡上的替換位置(調試)。

回答

0

你可以拿出某物。像:

(%[0-9A-F]{2}) 
# match a %, 
# followed by 0-9, A-F two times 

根據您的編程語言(?不指定),匹配所有與"~"代替捕獲組$ 1中。然後,您的字符串將成爲:

~~~~THE~QUICK%BROWN~~~~~~~~FOX~JUMPED~~~~OVER~THE~~~~LAZY~DOG 

a demo on regex101.com

1

試試這個表達式:

(%[0-13-9A-F][0-9A-F])+ 

它發現控制字符的所有序列重複,除了20%。

有了它,我得到這樣的輸出:

~THE%20QUICK%BROWN~FOX%20JUMPED~OVER%20THE~LAZY%20DOG 
0

當你說所有的控制字符,你可能想知道下面的報價。

控制字符不產生輸出本身,而是通常 控制終端以某種方式:例如,換行和退格是 控制字符。在ASCII平臺上,在ASCII範圍內,其代碼點在0和31之間的字符 ,加上127(DEL)是 控制字符;在EBCDIC平臺上,其對應的控制字符爲 。

你似乎在考慮%4E爲對應於信N

另外一個控制字符,你在你輸入的字母%BROWN;我相信你想它是%20BROWN

如果符合您的要求,那麼下面的正則表達式應該爲你

(工作:%(?:(?:[0-1] [0- 9F))| 7F))+

請確保您反覆用~替換此模式。此外,您可能想不區分大小寫的匹配

英語擊穿:

匹配任何有百分號後跟任意數量最多1F 或數7F

以下是perl的實現它

$s = q(%00%00%00%02THE%20QUICK%20BROWN%00%00%00%0D%00%00%00%0FFOX%20JUMPED%00%00%00%0EOVER%20THE%00%00%4E%02LAZY%20DOG); 
$s =~ s/(?:%(?:(?:[0-1][0-9A-F])|7F))+/~/gi; 
print $s; 
# output : ~THE%20QUICK%20BROWN~FOX%20JUMPED~OVER%20THE~%4E~LAZY%20DOG