给定以下输入字符串(其中没有空格):
000102030405060708090A0B0C0D0E0F10111213...
是否可以编写一个替换正则表达式来产生以下输出?
\t0x00, 0x01, 0x02, ... 0x0F\n
\t0x10, 0x11, 0x12, ...
基本上,将十六进制字符串分成 16 字节组,用逗号分隔各个 16 字节,为每个字节添加 0x 前缀,并在 16 字节边界上插入制表符和换行符。
我可以将两个十六进制字符与
[[:xdigit:]]{2}
匹配,这使我可以使用 0x$1,
进行替换,以按照我想要的方式获取各个字节的格式,但我想不出在每个 16 之后进行换行符和制表符插入的方法字节。
我想“不可能使用正则表达式”将是这个问题的可接受的答案(如果支持解释原因的文档链接) - 不会接受的是使用编程语言格式化字符串的建议,因为我已经知道怎么做。
如果您使用支持条件替换的 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