1

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

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

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

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

标记

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

4

8 回答 8

5

为什么不针对零测试十六进制值?更简单,更快,更具可读性。

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

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

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

于 2009-04-17T16:37:30.360 回答
2
/0x0*[1-9a-fA-F][0-9a-fA-F]*/

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

于 2009-04-17T16:44:35.100 回答
2

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

bool IsNonZeroHex(string input) {
  return !Regex.IsMatch(input, "^0x(0*)$");
}
于 2009-04-17T16:45:46.173 回答
1
/0x0*[^0]/
于 2009-04-17T16:43:50.313 回答
1

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

^0x(?=0*[1-9a-fA-F]0*)[0-9a-fA-F]{8}$
于 2009-04-17T16:49:55.040 回答
1

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

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

一个组被查找开始于0x

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

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

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

于 2019-05-30T15:32:38.067 回答
0

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

我是否过度简化它?这只是一种FALSE情况,对吧?当字符串为“0x00000000”时?

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

于 2009-04-17T16:38:03.977 回答
0
/0x0{0,7}[^0]/

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

于 2009-04-17T17:21:34.950 回答