我正在尝试检查字符串是否为十六进制。下面的代码工作正常。
[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 那么 A|B=B
因此 ([0-9A-F]+)|([0-9A-FX]+) = [0-9A-FX]+。
量子点