【问题标题】:Regex for matching hexadecimal numbers?正则表达式匹配十六进制数字?
【发布时间】:2017-02-27 03:45:30
【问题描述】:

所以我想弄清楚如何使用正则表达式来匹配十六进制字符串。我正在使用的当前正则表达式是:

[^0]+

我希望它匹配:50 6C 65 63 74 72 6F 6E 73 给定:

50 6C 65 63 74 72 6F 6E 73 00 00 00 00 00 00 00 
64 35 75 73 70 73 34 00 01 00 00 00 00 00 00 00 
52 61 79 74 69 6E 00 00 00 00 00 00 00 00 00 00 
63 38 63 61 70 73 34 00 01 00 00 00 00 00 00 00 
92 B6 B3 F5 00 00 00 01 8A 68 58 DD 00 00 00 00 
00 00 00 00 

但它只匹配50

当使用这个十六进制字符串时,它会按照我想要的方式工作:

52 61 79 74 69 6E 00 00 00 00 00 00 00 00 00 00 
63 38 63 61 70 73 34 00 01 00 00 00 00 00 00 00 
52 69 70 74 69 64 65 31 30 33 30 00 00 00 00 00 
64 32 75 73 70 73 34 00 01 00 00 00 00 00 00 00 
B3 F4 0A 88 00 00 00 1F C0 95 41 99 00 00 00 00 
00 00 00 00 

匹配52 61 79 74 69 6E

【问题讨论】:

    标签: c# regex hex match


    【解决方案1】:

    这将按数字匹配:

    [a-fA-F0-9]{2}
    

    Online example

    这将匹配整个字符串:

    ^([a-fA-F0-9]{2}\s+)+
    

    Online example

    【讨论】:

      【解决方案2】:

      我对您的正则表达式如何匹配50 而不仅仅是5 有点困惑。但总的来说,您的正则表达式的问题在于它会一直运行到 0,而您想要的是让它一直运行到您连续遇到两个零。执行此操作的标准方法是环顾四周:

      .+?(?= 00)
      

      .+ 将尽可能长时间地匹配任何字符。正则表达式的第二部分(称为正向前瞻)搜索两个零并在 00 出现之前终止匹配。使用.+? 而不仅仅是.+ 的原因是后者将匹配直到最后一个00 的所有内容,而您只想要直到第一个00 的所有内容。 ?.+ 转换为惰性正则表达式,因此它匹配所需的最小值而不是可能的最大值。在这种情况下,这意味着它将匹配到第一个 00 而不是最后一个 00

      请注意,在环视中我包含了一个空格,这样您的匹配项就不会在字符串末尾包含空格。不确定这对你是否重要。

      【讨论】:

      • 你是对的,如果我可以的话,它只匹配 5 个 id + 代表你我刚刚创建了我的帐户,所以我不能,谢谢你解释它是如何工作的,现在我对正则表达式有了更好的理解
      • 没问题,很高兴有帮助
      【解决方案3】:

      你可以这样写:

      (?!00)[0-9A-F]{2}
      

      这说的是

      1. 如果以 00 开头则拒绝
      2. 如果值为 0-9 或 A-F,则接受
      3. 取两个字符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 2016-12-30
        • 2017-06-17
        • 2019-02-28
        • 2016-12-03
        相关资源
        最近更新 更多