我正在寻找一个正则表达式来确定32位十六进制值中的任何值何时为非零。
数据模式看起来像0x00000000
,我想知道任何数字何时为非零。例如,如果正则表达式捕获0x00001000
或0x10000000
或0xB000000
,而不是0x00000000
模式。现在我执行
0x[^0]
0x0[^0]
0x00[^0]
...
0x0000000[^0]
这会起作用,但如果可能的话,我更愿意使用一种模式。感谢。
标记
编辑:我没有提到,因为程序中不需要RegEx,否则我会使用不同的方法,但我使用RegEx使用UltraEdit在日志文件中搜索值。我本可以开发一个程序或其他方法来搜索,但我只是在偷懒,只是说实话。 Ben S解决方案在UltraEdit和Rad Software正则表达式设计器中都有效。 rampion解决方案在两种工具中都不起作用,不确定原因。
答案 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一起使用。不知道哪些编辑器支持负前瞻。