如何用正则表达式按指定分段长度切割连续字符串
按指定长度序列分割字符串的正则实现方案
原正则失效原因
你之前编写的\b\w{1,74}\w{1,64}\w{1,22}\w{1,10}\w{1,94}\w{1,40}\w{1,80}\w{1,40}\w{1,20}\b无法生效有两个核心原因:
- 所有长度量词连续拼接,正则会把所有规则叠加匹配一整段连续字符串,无法拆分出对应长度的独立分段
\b单词边界在十六进制字符串开头的0x位置匹配逻辑不符合预期,会截断正常匹配
实现方案
固定长度序列场景
如果你的分割长度是固定的,可以直接编写带捕获组的正则,执行match后取出捕获组结果即可:
const str = '0x60c980600b6000396000f360208060008037602181600080600261fffff136602014167faf92e7b2c77d83eaf65cbf5ab7415c4eddfd900eab716dcd6c43d5cd998c32a6602151141660505736156400611cfbfc421116608d57fe5b7f8c1d64e3bd87387709175b9ef4e7a1d7a8364559fc0e2ad9d77953909a0d1eb360206000a173578c86b36a7694d4eafc88c4ac8efb369b5317a8ff5b7f5d26862916391bf49478b2f5103b0720a842b45ef145a268f2cd1fb2aed55178600080a1739a54cb6a479023658cea01425e8035e4df93f925ff'; // 按你的分段长度要求编写正则,每个捕获组对应一段固定长度 const splitReg = /^(.{74})(.{64})(.{22})(.{10})(.{94})(.{40})(.{80})(.{40})(.{20})$/; const splitResult = str.match(splitReg).slice(1); // 输出分段后的数组 console.log(splitResult);
动态长度序列场景
如果分割长度需要经常调整,可以动态生成正则,避免手动拼接的麻烦:
const str = '0x60c980600b6000396000f360208060008037602181600080600261fffff136602014167faf92e7b2c77d83eaf65cbf5ab7415c4eddfd900eab716dcd6c43d5cd998c32a6602151141660505736156400611cfbfc421116608d57fe5b7f8c1d64e3bd87387709175b9ef4e7a1d7a8364559fc0e2ad9d77953909a0d1eb360206000a173578c86b36a7694d4eafc88c4ac8efb369b5317a8ff5b7f5d26862916391bf49478b2f5103b0720a842b45ef145a268f2cd1fb2aed55178600080a1739a54cb6a479023658cea01425e8035e4df93f925ff'; // 自定义分割长度序列 const splitLengths = [74, 64, 22, 10, 94, 40, 80, 40, 20]; // 动态生成正则 const dynamicReg = new RegExp(splitLengths.map(len => `(.{${len}})`).join('')); const splitResult = str.match(dynamicReg).slice(1); console.log(splitResult);
注意事项
- 请确保原字符串总长度等于所有分割长度的总和,否则匹配会失败。如果需要兼容长度不足/有冗余的场景,可以在正则最后追加
(.*)捕获剩余内容。 - 如果字符串中包含换行符,需要给正则加
s单行标志,让.可以匹配换行符。
内容的提问来源于stack exchange,提问作者Andon Mitev
相关产品推荐
相关产品推荐

