Java 十六进制字符

Java 十六进制字符,java,regex,Java,Regex,我正在检查字符串是否为十六进制。下面的代码工作正常 [0-9A-F]+ 在某些情况下,中间会有字符“X”,例如 1234X3D X12353D 1234E3X 有人能帮我修改这个正则表达式吗?如果您不想问为什么要将X看作十六进制数字,您的问题的正确答案是: [0-9A-FX]+ 正则表达式不需要“X”出现。 虽然这也是可以接受的,但: ([0-9A-F]+)|([0-9A-FX]+) 这是不必要的复杂和冗余。这是因为[0-9A-F]+是[0-9A-FX]+的子集。考虑这里创建的D

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

   [0-9A-F]+
在某些情况下,中间会有字符“X”,例如

1234X3D

X12353D

1234E3X


有人能帮我修改这个正则表达式吗?

如果您不想问为什么要将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=B

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


QED在我的书中不是十六进制字符……是的,我试过了。只有在某些情况下,才会出现字符“X”。所以,如果你试图检查它们是否是十六进制的,那么这应该是一个选项,但失败了。。。它们不是十六进制的。看来你真的想做些别的事。第一条注释告诉您如何将
X
添加到setX中。X不是十六进制字符。与十六进制一起,在某些字符串中,字符X出现“在某些情况下,字符“X”之间会出现,例如,
1234X3D
X12353D
1234E3X
”和?好吗?坏吗?你想达到什么目标?你能提供一些输入和预期输出的例子吗?