2012-12-05 228 views
-1

我想檢查字符串是否爲十六進制。下面的代碼工作正常。十六進制字符

[0-9A-F]+ 

在某些情況下,將有字符 'X' 像插圖中,

1234X3D

X12353D

1234E3X

有人可以幫助我在改變這個正則表達式?

+2

'[0-9A-FX] +'是否足夠? – femtoRgon

+3

'X'不是我書中的十六進制字符... –

+0

是的,我試過了。只有在某些情況下,字符'X'出現。所以它應該是一個可選的 – FirmView

回答

1

沒有質疑爲什麼你要考慮X爲十六進制數字,正確回答你的問題是:

[0-9A-FX]+ 

無處這是否正則表達式需要一個「X」存在。 雖然這是可以接受的,以及:

([0-9A-F]+)|([0-9A-FX]+) 

這是不必要的複雜,和冗餘。這是因爲[0-9A-F] +是[0-9A-FX] +的子集。考慮DFA在這裏創建:

DFA1:[0-9A-F] +

Accepting: state 1 
State 0  input: 0-9A-F    to state 1 
State 1  input: 0-9A-F    to state 1 

DFA2:[0-9A-FX] +

Accepting: state 1 
State 0  input: 0-9A-F    to state 1 
State 0  input: X     to state 1 
State 1  input: 0-9A-F    to state 1 
State 1  input: X     to state 1 

注意,所有的接受狀態目前在DFA1中的轉換也存在於DFA2中。因此DFA1([0-9A-F] +)的匹配輸入是DFA2的一個子集([0-9A-FX] +)

或者,更簡明地:

([0-9A- F] +)⊆([0-9A-FX] +)

並且如果⊆B,則A | B = B

因此([0-9A-F] +)|([O- 9A-FX] +)= [0-9A-FX] +。

QED

+0

+1集合論! – slebetman

相關問題