如何编写正则表达式提取CAN日志中00/55连续重复前的内容?
解决方案
正则表达式说明
要提取十六进制字符对序列中,结尾全为00或全为55的后缀之前的所有内容(若没有此类后缀则保留整个序列),可以使用以下正则组合:
- 优先匹配存在全
00/全55后缀的前缀:^(.+?)(?=(?: 00)+$|(?: 55)+$) - 若上述正则无匹配结果(即不存在全
00/全55的后缀),则匹配整个字符串:^.*$
正则拆解
^:匹配字符串起始位置(.+?):非贪婪捕获任意字符,直到满足后续正向预查条件(?=(?: 00)+$|(?: 55)+$):正向预查,确保后续内容是连续00直到结尾,或是连续55直到结尾^.*$:兜底规则,当无符合要求的后缀时,捕获整个序列
测试验证
针对你的示例逐一验证:
- String 1:
01 3E 55 55 55 55 55 55- 匹配前缀
01 3E(后续全为55),符合期望。
- 匹配前缀
- String 2:
01 7E 00 00 00 00 00 00- 匹配前缀
01 7E(后续全为00),符合期望。
- 匹配前缀
- String 3:
21 51 00 00 66 63 51 00- 匹配前缀
21 51 00 00 66 63 51(后续全为00),符合期望。
- 匹配前缀
- String 4:
22 00 00 00 00 37 41 31- 无全
00/全55后缀,匹配整个字符串,符合期望。
- 无全
- 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
相关产品推荐
相关产品推荐

