十六进制字符

时间:2012-12-05 23:44:19

标签: java regex

我正在尝试检查字符串是否为十六进制。以下代码工作正常。

   [0-9A-F]+

在某些情况下,中间会有字符“X”,如

1234X3D

X12353D

1234E3X

有人可以帮我改变这个正则表达式吗?

1 个答案:

答案 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