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
”和?好吗?坏吗?你想达到什么目标?你能提供一些输入和预期输出的例子吗?