我正在尝试检查字符串是否为十六进制。以下代码工作正常。
[0-9A-F]+
在某些情况下,中间会有字符“X”,如
1234X3D
X12353D
1234E3X
有人可以帮我改变这个正则表达式吗?
答案 0 :(得分: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] +)
如果A⊆B则A | B = B
因此([0-9A-F] +)|([0-9A-FX] +)= [0-9A-FX] +。
QED