-1

文字列が16進数かどうかを確認しようとしています。以下のコードは正常に動作します。

   [0-9A-F]+

場合によっては、間に文字「X」が含まれます。

1234X3D

X12353D

1234E3X

誰かがこの正規表現を変更するのを手伝ってくれますか?

4

1 に答える 1

1

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

于 2012-12-06T06:23:50.090 に答える