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

如何编写正则表达式提取CAN日志中00/55连续重复前的内容?

解决方案

正则表达式说明

要提取十六进制字符对序列中,结尾全为00或全为55的后缀之前的所有内容(若没有此类后缀则保留整个序列),可以使用以下正则组合:

  1. 优先匹配存在全00/全55后缀的前缀:
    ^(.+?)(?=(?: 00)+$|(?: 55)+$)
    
  2. 若上述正则无匹配结果(即不存在全00/全55的后缀),则匹配整个字符串:
    ^.*$
    

正则拆解

  • ^:匹配字符串起始位置
  • (.+?):非贪婪捕获任意字符,直到满足后续正向预查条件
  • (?=(?: 00)+$|(?: 55)+$):正向预查,确保后续内容是连续 00直到结尾,或是连续 55直到结尾
  • ^.*$:兜底规则,当无符合要求的后缀时,捕获整个序列

测试验证

针对你的示例逐一验证:

  1. String 1:01 3E 55 55 55 55 55 55
    • 匹配前缀01 3E(后续全为55),符合期望。
  2. String 2:01 7E 00 00 00 00 00 00
    • 匹配前缀01 7E(后续全为00),符合期望。
  3. String 3:21 51 00 00 66 63 51 00
    • 匹配前缀21 51 00 00 66 63 51(后续全为00),符合期望。
  4. String 4:22 00 00 00 00 37 41 31
    • 无全00/全55后缀,匹配整个字符串,符合期望。
  5. String 5:30 00 00 55 55 55 55 55
    • 原后缀同时包含00和55,不属于全同后缀,因此会匹配整个字符串。若你期望仅保留30,可使用以下适配混合后缀场景的正则:
      ^([0-9A-F]{2})(?=(?: 00)+(?: 55)+$|(?: 55)+(?: 00)+$)|^(.+?)(?=(?: 00)+$|(?: 55)+$)|^.*$
      
      该正则会优先捕获混合00/55后缀的首个字符对,再处理全同后缀情况,最后兜底匹配整个序列。

原正则不符合预期的原因

你使用的([0-9A-F]{2,} (?!55|00))+存在两个核心问题:

  • 仅匹配**紧跟的下一个字符对不是55/00**的内容,无法识别“后续所有内容都是55/00”的场景(比如3E后面是55,会被错误排除)。
  • 匹配逻辑零散,只能捕获孤立的符合条件的字符对,而非连续的目标前缀。

内容的提问来源于stack exchange,提问作者zwalsh57

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:27:46