是否可以仅使用正则表达式来分割这样的十六进制字符串?

问题描述 投票:0回答:1

给定以下输入字符串(其中没有空格):

000102030405060708090A0B0C0D0E0F10111213...

是否可以编写一个替换正则表达式来产生以下输出?

\t0x00, 0x01, 0x02, ... 0x0F\n
\t0x10, 0x11, 0x12, ...

基本上,将十六进制字符串分成 16 字节组,用逗号分隔各个 16 字节,为每个字节添加 0x 前缀,并在 16 字节边界上插入制表符和换行符。

我可以将两个十六进制字符与

[[:xdigit:]]{2}
匹配,这使我可以使用
0x$1, 
进行替换,以按照我想要的方式获取各个字节的格式,但我想不出在每个 16 之后进行换行符和制表符插入的方法字节。

我想“不可能使用正则表达式”将是这个问题的可接受的答案(如果支持解释原因的文档链接) - 不会接受的是使用编程语言格式化字符串的建议,因为我已经知道怎么做。

regex hex pcre
1个回答
0
投票

如果您使用支持条件替换的 PCRE 风格,您可以通过匹配来完成此操作:

(..)(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?(..)?

即一对数字后跟 15 个可选数字对,然后将其替换为

\t0x$1${2:+,0x$2:}${3:+,0x$3:}${4:+,0x$4:}${5:+,0x$5:}${6:+,0x$6:}${7:+,0x$7:}${8:+,0x$8:}${9:+,0x$9:}${10:+,0x$10:}${11:+,0x$11:}${12:+,0x$12:}${13:+,0x$13:}${14:+,0x$14:}${15:+,0x$15:}${16:+,0x$16:}\n

条件替换会在任何匹配的可选组前面添加

,0x

对于此输入:

000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122

输出将是:

    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F
    0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F
    0x20,0x21,0x22

regex101 上的正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.