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

Regex 非零十六进制值的正则表达式,regex,hex,Regex,Hex,我正在寻找一个正则表达式来确定32位十六进制值中的任何值何时为非零 数据模式看起来像0x00000000,我想知道什么时候任何数字都不是零。例如,如果正则表达式将捕获0x000001000或0x10000000或0xB000000,而不是0x00000000模式。现在我进行了一个步行模式匹配 0x[^0] 0x0[^0] 0x00[^0] ... 0x0000000[^0] 这将起作用,但如果可能的话,我宁愿有一种模式。谢谢 标记 编辑:我没有提到,因为程序中不需要正则表达式,否则我会使用不同

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

数据模式看起来像
0x00000000
,我想知道什么时候任何数字都不是零。例如,如果正则表达式将捕获
0x000001000
0x10000000
0xB000000
,而不是
0x00000000
模式。现在我进行了一个步行模式匹配

0x[^0]
0x0[^0]
0x00[^0]
...
0x0000000[^0]
这将起作用,但如果可能的话,我宁愿有一种模式。谢谢

标记


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

为什么不用零来测试十六进制值?更简单、更快、更可读

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

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


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

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

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

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


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

当然是一个简单的字符串比较,如果它
不等于
“0x00000000”,您就得到了匹配项

我是不是过于简化了?只有一个
FALSE
案例,对吗?当字符串为“0x00000000”时


除非必须,否则不要使用正则表达式。

当然是一个简单的字符串比较,如果它不等于“0x00000000”,那么就得到了匹配项

/0x0*[^0]/
我是不是过于简化了?只有一个
FALSE
案例,对吗?当字符串为“0x00000000”时

除非必须,否则不要使用正则表达式

/0x0*[^0]/
*
表示匹配原子0次或多次,因此此模式匹配
0x
前缀,后跟0次或多次
0
s,后跟非零十六进制,后跟一些十六进制


*
意味着匹配原子0次或多次,因此此模式匹配
0x
前缀,后跟0次或多次
0
s,后跟一个非零十六进制,后跟一些十六进制。

为什么不尝试一些稍微不同的方法呢。测试非零十六进制比测试零十六进制困难得多。因此,测试零位并手动执行not

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

为什么不试试完全不同的东西呢。测试非零十六进制比测试零十六进制困难得多。因此,测试零位并手动执行not

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

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


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

0x
”,后跟0到7“
0
”,后跟不是“
0
”的内容


0x
”,后跟0到7“
0
”,后跟非“
0

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

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

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

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


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

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

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

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

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



使用PCRE、JavaScript和Python。不知道哪些编辑器支持否定的前瞻性。

这不允许中间的零点。当然会。没有人说匹配的字符串必须以模式结尾。重点是最后的0*是多余的。我的重点是0x101将只返回0x10。。。不太确定这是洛霍格想要的;)修正了中间零点的问题,现在和RAMPIN的答案类似,我相信,这是正确的。这不会让零点在中间。当然会。没有人说匹配的字符串必须以模式结尾。重点是最后的0*是多余的。我的重点是0x101将只返回0x10。。。不太确定这是洛霍格想要的;)编辑以修复中间零的问题。它现在类似于rampion的答案,我相信,这是正确的。只需匹配所有十六进制值,然后测试它是否等于零,或者换句话说,使用
0x00000000
作为正则表达式,如果不匹配则进行分支。rampion解决方案不起作用,因为他包括了开始和结束正则表达式斜杠(/)编辑器不需要的。只需匹配所有十六进制值,然后测试它是否等于零,或者换句话说,使用
0x00000000
作为正则表达式,如果不匹配则进行分支。rampion解决方案不起作用,因为他包含了编辑器不需要的开始和结束正则表达式斜线(/)。他想要非固定长度,像0x0或0x000,他想要非固定长度,像0x0或0x000,这将匹配第一个零列表,后面是一个非零。。。类似0x11的东西只返回0x1这将匹配“0x0”这样的行,我很想否决投票。OP没有说他匹配的是行,他说他匹配的是十六进制数。如果它是为任意文本行中的内容编写的,则会有所不同,是的。这将匹配