You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否仅通过正则表达式拆分并格式化长十六进制字符串?

能否仅通过正则表达式拆分并格式化长十六进制字符串?

当然可以做到,但得看你用的正则引擎是否支持高级特性(像PCRE、Python的re模块、JavaScript ES2018+这类都没问题,但老旧的POSIX正则就不行)。我给你拆解下实现思路和具体的正则方案:

核心思路

你的需求其实是两层格式化逻辑:

  1. 把每两个十六进制字符转换成 0xXX, 的格式
  2. 每凑够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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:08:08