【问题标题】:Regular expression for a non-zero hex value非零十六进制值的正则表达式
【发布时间】:2010-10-20 03:45:14
【问题描述】:

我正在寻找一个正则表达式来确定 32 位十六进制值中的任何值何时非零。

数据模式看起来像0x00000000,我想知道任何数字何时非零。例如,如果0x000010000x100000000xB000000 将被正则表达式捕获,而不是0x00000000 模式。现在我执行的步行模式匹配

0x[^0]
0x0[^0]
0x00[^0]
...
0x0000000[^0]

这会起作用,但如果可能的话,我更愿意使用一种模式。谢谢。

标记

编辑:我没有提到,因为程序中不需要 RegEx,否则我会使用不同的方法,但我使用 RegEx 来使用 UltraEdit 在日志文件中搜索值。我本可以开发一个程序或其他一些搜索方式,但我只是懒惰,只是诚实。 Ben S 解决方案在 UltraEdit 和 Rad Software 正则表达式设计器中都有效。 rampion 解决方案在这两种工具中都不起作用,不知道为什么。

【问题讨论】:

  • 只匹配所有十六进制值,然后测试是否等于零
  • 或者换句话说,使用0x00000000作为你的正则表达式,如果不匹配则分支。
  • rampion 解决方案不起作用,因为他包含了编辑不需要的开始和结束正则表达式斜杠(/)。

标签: regex hex


【解决方案1】:

为什么不针对零测试十六进制值?更简单、更快、更易读。

如果确实需要正则表达式,0x0*[1-9a-fA-F][0-9a-fA-F]* 应该这样做。

它会寻找尽可能多的零,直到找到一个非零的十六进制值,然后收集其余的十六进制值,无论它是否为零。

注意:这将匹配任何长度的十六进制,而不仅仅是 32 位。

【讨论】:

  • 这不允许中间有零.. 像 0x101
  • 当然会。没有人说匹配的字符串必须以模式结尾。关键是最后的 0* 是多余的。
  • 我的意思是 0x101 只会返回 0x10 ...不太确定这就是 lordhog 想要的 ;)
  • 已编辑以修复中间零问题。
  • 现在类似于 rampion 的回答,我相信这是正确的。
【解决方案2】:

当然是一个简单的字符串比较,如果它是 DOES NOT EQUAL"0x00000000" 你就找到了。

我是否过度简化了它?只有一个FALSE 案例,对吧?当字符串为“0x00000000”时?

除非必要,否则不要使用 RegEx。

【讨论】:

  • 他想要非固定长度,比如 0x0 或 0x0000
【解决方案3】:
/0x0*[^0]/

【讨论】:

  • 这将匹配第一个零列表,后跟一个非零...类似 0x11 将仅返回 0x1
  • 这将匹配像“0x0”这样的行,我很想投反对票。
  • OP 没有说他匹配的是一行,他说他匹配的是一个十六进制数。如果它是为任意文本行中的内容编写的,那将是不同的,是的。
【解决方案4】:
/0x0*[1-9a-fA-F][0-9a-fA-F]*/

<i>&lt;atom&gt;*</i> 表示匹配原子 0 次或多次,因此此模式匹配 0x 前缀,后跟 0 或多个 0s,后跟非零十六进制,然后是一些十六进制。

【讨论】:

  • 我认为最后一个 * 不应该在那里,你想匹配至少一个非零字符,你不需要匹配任何粘贴第一个。
【解决方案5】:

为什么不尝试一些稍微不同的东西。测试非零十六进制比测试零十六进制要困难得多。所以测试为零并手动执行。

bool IsNonZeroHex(string input) {
  return !Regex.IsMatch(input, "^0x(0*)$");
}

【讨论】:

    【解决方案6】:

    我认为这应该涵盖所有情况(如果它真的必须是正则表达式):

    ^0x(?=0*[1-9a-fA-F]0*)[0-9a-fA-F]{8}$
    

    【讨论】:

    • 这是否会强制 0 填充,因为它需要 8 个字符的长度。那么0xfd3呢?这仍然是一个有效的 32 位十六进制值。
    • 嗯,是的,我专注于精确匹配。但是由于您的解决方案使用更简单的正则表达式完成了所有这些操作,因此不再重要:)
    【解决方案7】:
    /0x0{0,7}[^0]/
    

    '0x',后跟零到七个'0',后跟不是'0'的东西

    【讨论】:

      【解决方案8】:

      可以使用负前瞻来查找固定大小的十六进制数字:

      /(0x(?!0{8})[0-9a-fA-F]{8})/
      

      查找以0x开头的组

      然后否定前瞻0{8}(如果找到则失败)

      否则匹配[0-9a-fA-F]{8}

      适用于 PCRE、JavaScript、Python。不知道哪些编辑器支持负前瞻。

      【讨论】:

        猜你喜欢
        • 2019-04-25
        • 1970-01-01
        • 2014-07-02
        • 2014-03-05
        • 2011-10-03
        • 2017-10-22
        • 1970-01-01
        • 2012-07-12
        相关资源
        最近更新 更多