能否仅通过正则表达式拆分并格式化长十六进制字符串?
能否仅通过正则表达式拆分并格式化长十六进制字符串?
当然可以做到,但得看你用的正则引擎是否支持高级特性(像PCRE、Python的re模块、JavaScript ES2018+这类都没问题,但老旧的POSIX正则就不行)。我给你拆解下实现思路和具体的正则方案:
核心思路
你的需求其实是两层格式化逻辑:
- 把每两个十六进制字符转换成
0xXX,的格式 - 每凑够16个这样的字节组后,插入换行+制表符,同时给每一行开头加上制表符
具体实现(PCRE兼容引擎为例)
我们可以用三步纯正则替换完成,全程不需要额外的编程语言逻辑:
1. 处理16字节的完整块
开启全局替换模式,匹配连续32个十六进制字符(也就是16字节,每个字节占2个字符),同时在替换时自动把块内的每两个字符加上0x前缀和逗号,再给块加上开头的制表符和结尾的换行:
- 查找正则:
((?:[[:xdigit:]]{2}){16}) - 替换模板:
\t${1/([[:xdigit:]]{2})/0x$1, /g}\n
这里的${1/.../.../g}是PCRE的特殊语法:对第一个捕获组(也就是整个16字节块)内部做子正则替换,把每两个字符转成0xXX, 的格式。
2. 处理末尾不足16字节的块
如果原字符串长度不是16字节的整数倍,最后会剩下一组不足16个的字节,我们单独处理这部分:
- 查找正则:
((?:[[:xdigit:]]{2}){1,15})$ - 替换模板:
\t${1/([[:xdigit:]]{2})/0x$1, /g}
3. 清理多余的尾逗号
最后把所有行末尾多余的, 去掉:
- 查找正则:
, $ - 替换模板:``(空字符串)
为什么你之前没搞定?
你之前只匹配了单个两字节组,核心是没利用量词分组((?:[[:xdigit:]]{2}){16})来批量捕获16字节的块,再结合子替换处理块内的每个字节。如果你的正则引擎不支持这种嵌套替换或者连续匹配锚点\G,那确实纯正则做不到——因为基础正则是无状态的,没法记录“已经匹配了多少个字节,到16个就插入换行”,只有支持回溯和状态记录的高级正则引擎才能实现这种计数逻辑。
备注:内容来源于stack exchange,提问作者Igor Levicki
相关产品推荐
相关产品推荐

