2009-04-17 99 views
1

我正在尋找一個正則表達式來確定32位十六進制值中的任何值何時不爲零。非零十六進制值的正則表達式

數據模式看起來像0x00000000,我想知道任何數字何時不爲零。例如,如果0x000010000x100000000xB000000將由正則表達式捕獲,但不是0x00000000模式。現在我執行一個步行模式匹配的

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

這會工作,但我寧願有一個模式,如果可能的話。謝謝。

馬克

編輯:作爲一個程序是沒有必要的正則表達式我不提,否則我會用不同的方法,但是我用的是使用正則表達式來搜索值在日誌文件UltraEdit的。我本來可以開發一個程序或其他手段來搜索,但我只是懶惰,只是誠實。 Ben S解決方案可以在UltraEdit和Rad Software Regular Expression Designer中使用。 rampion解決方案在兩種工具中都不起作用,不知道爲什麼。

+0

只是匹配所有十六進制值,然後測試它是否等於零 – Aziz 2009-04-17 16:39:08

+0

或換句話說,使用`0x00000000`作爲您的正則表達式,並且如果它是分支不匹配。 – TMN 2009-04-17 17:51:52

+0

rampion解決方案不起作用,因爲他包括編輯器不需要的開始和結束正則表達式斜線(/)。 – 2009-04-17 19:28:06

回答

4

爲什麼不測試十六進制值對零?更簡單,更快,更具可讀性。

如果一個正則表達式g真的有必要,0x0*[1-9a-fA-F][0-9a-fA-F]*應該這樣做。

它尋找儘可能多的零,直到它找到一個非零的十六進制值,然後收集十六進制的其餘部分,無論它是否爲零。

注意:這將匹配任何長度十六進制,不只是32位。

+1

這不會讓零在中間..就像0x101 – Aziz 2009-04-17 16:38:27

+0

當然會。沒有人說匹配的字符串必須以模式結束。重點是最後的0 *是多餘的。 – Svante 2009-04-17 16:49:03

+0

我的觀點是,0x101將只返回0x10 ...不太確定,這是lordhog想要的;) – Aziz 2009-04-17 16:51:47

0

當然,一個簡單的字符串比較,如果它「0x00000000」你有你的匹配。

我過度簡化了嗎?這只是一個FALSE的情況吧?當字符串是「0x00000000」?

除非必須,否則請勿使用RegEx。

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

<atom>*手段0次或多次匹配原子,所以這種模式的0x前綴,隨後0以上0秒,然後非零十六進制,隨後一些六角相匹配。

2

爲什麼不嘗試一些略有不同的東西。測試非零十六進制比測試十六進制要困難得多。因此,測試零,手動做不。

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

我想這應該涵蓋所有的情況下(如果它真的必須是一個正則表達式):

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

'0x',後面的零到七 '0',其次是東西不是'0'

相關問題