-1

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

   [0-9A-F]+

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

1234X3D

X12353D

1234E3X

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

4

1 回答 1

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]+。

量子点

于 2012-12-06T06:23:50.090 回答