文字列が16進数かどうかを確認しようとしています。以下のコードは正常に動作します。
[0-9A-F]+
場合によっては、間に文字「X」が含まれます。
1234X3D
X12353D
1234E3X
誰かがこの正規表現を変更するのを手伝ってくれますか?
Xを16進数として考えたい理由を疑うことなく、あなたの質問に対する正解は次のとおりです。
[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