正则表达式替换逃逸字符串中的模式控制字符

问题描述:

我有一个包含某些控制字符的转义字符串。 控制字符是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-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

试试这个表达式:

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

它发现控制字符的所有序列重复,除了20%。

有了它,我得到这样的输出:

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

当你说所有的控制字符,你可能想知道下面的报价。

控制字符不产生输出本身,而是通常 控制终端以某种方式:例如,换行和退格是 控制字符。在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