【问题标题】:Regex Match Hexidecimal in Groups of 2-8正则表达式匹配 2-8 组中的十六进制
【发布时间】:2019-02-28 14:50:07
【问题描述】:

我正在研究一个正则表达式来匹配一个十六进制字符串,并且在接近尾声时遇到了一些麻烦。我专门寻找不包含 00 且长度在 2 到 8 个字节之间的 2 个字节组。除了当少于 8 个字节时,它会允许额外的 00 在其中。

https://regex101.com/r/jq3QpP/1/

(?!(00)+)([0-9a-fA-F]{2,8})?(?!(00)+)    // This on the below text gives the following matches


C86B0200554E0200C86B02000000000000000000270000008109000000000000EC6A050079750
18881000000410000280100000000000000000001000002010400000000000000000000000000
0000000000000000000000F65FA45900000000FF0000002F0000000000000049000000403C9F5
A000000000000000000000000FFFF330000000000000F06EAE8333536

Match 1
Full match  0-8 `C86B0200`
Group 2.    0-8 `C86B0200`
Match 2
Full match  8-16    `554E0200`
Group 2.    8-16    `554E0200`
Match 3
Full match  16-21   `C86B0`
Group 2.    16-21   `C86B0`
Match 4
Full match  21-21   ``
Match 5
Full match  39-47   `02700000`
Group 2.    39-47   `02700000`

在第 1,2,5 场比赛中有额外的 00,在第 3 场比赛中,由于某种原因错过了 20。如果你知道我错过了什么,请告诉我

【问题讨论】:

  • 00 是否需要与一个字节对齐,或者它可以在任何地方。即10011111 应该不匹配吗?
  • 它需要与一个字节对齐,我也试过 ([0-9a-fA-F][0-9a-fA-F]){1,4} 但我也有问题
  • 数据是来自一个文件的标题信息,其中包含我需要提取的 INT32 数字,但如果这有助于理解我在做什么,这些数字用多个 00 分隔

标签: regex hex binary-search


【解决方案1】:

您可以避免匹配00,方法是一次只允许一个两位数的0

(?:[A-F1-9][A-F0-9]|[A-F0-9][A-F1-9]){1,4}(?=(?:..)*$)

演示:https://regex101.com/r/2hebvf/2

【讨论】:

  • 谢谢,这是个好主意。我的小提琴出错了,但使用这个想法可行:(?:[A-F1-9][A-F0-9]|[A-F0-9][A-F1-9]){1,4}
  • 糟糕,我的解决方案没有保持字节对齐
  • 这个似乎在工作(([A-F1-9][A-F0-9]|[A-F0-9][A-F1-9]){1,4})(?:00)+
  • 我使用了一些工具和编程语言不支持的可变宽度lookbehind断言,以确保字节对齐到字符串的开头,这可能会导致您的错误工具,但如果你的字符串总是有偶数位数,那么只需确保偶数位数直到字符串末尾就足够了。我已经相应地更新了我的答案。
  • 顺便说一下,例如,如果字符串以000A 结尾,那么最后带有(?:00)+ 的正则表达式将不起作用。您应该使用匹配偶数位数直到字符串结尾的前瞻断言。如果您认为它是正确的,请随时接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2013-11-26
  • 2017-06-17
  • 2012-10-02
  • 1970-01-01
相关资源
最近更新 更多