非零十六进制值的正则表达式

时间:2009-04-17 16:33:40

标签: regex hex

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

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

的步行模式匹配
0x[^0]
0x0[^0]
0x00[^0]
...
0x0000000[^0]

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

标记

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

8 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

/0x0*[1-9a-fA-F][0-9a-fA-F]*/

<atom>*表示匹配原子0次或更多次,因此此模式匹配0x前缀,后跟0或更多0 s,后跟非零十六进制,然后一些十六进制。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

/0x0*[^0]/

答案 4 :(得分:0)

当然是一个简单的字符串比较,如果它DOES NOT EQUAL“0x00000000”你就得到了你的匹配。

我是在简化它吗?只有一个FALSE案例,对吗?当字符串是“0x00000000”?

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

/0x0{0,7}[^0]/

'0x',然后是0到7'0',后跟不是'0'

的内容

答案 7 :(得分:0)

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

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

0x开始查找组

然后负面地向前看0{8}(如果找到则失败)

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

可与PCRE,JavaScript,Python一起使用。不知道哪些编辑器支持负前瞻。