0

Qt で LineEdit ウィジェットの入力を検証しようとしています。正規表現を初めて使用するので、助けが必要です。スペースで区切られた 1 ~ 32 の 16 進数バイトを許可したい。たとえば、これは有効である必要があります。

"0a 45 bc 78 e2 34 71 af"

以下は、無効な入力の例です。

"1 34 bc 4e"→ ペアで書く必要があるので、1 は 01 でなければなりません。

"8a cb3 58 11"-> cb3 が無効です。

"56 f2 a8 69 "-> 末尾のスペースは許可されません。

頭を悩ませた後、うまくいくように見えるこの正規表現を思いつきました:

"([0-9A-Fa-f]{2}[ ]){0,31}([0-9A-Fa-f]{2})"

私の質問に移りましょう:

  1. テストで表示されなかった正規表現の問題はありますか? もしそうなら、どうすれば改善できますか?

  2. それを書くためのよりクリーンな方法はありますか?

前もって感謝します

4

1 に答える 1

2

検証にどの方法を使用したかはわかりませんが、考えられる問題の 1 つは、文字列がパターンに一致するかどうかをチェックするのではなく、パターンに一致する部分文字列を文字列で検索することです。exactMatch正規表現に対して文字列を検証するために使用します。

いずれにせよ、アンカー^とを追加する$方が安全です (exactMatchただし、 を使用する場合は必要ありません)。

"^([0-9A-Fa-f]{2}[ ]){0,31}([0-9A-Fa-f]{2})$"

検証を行っているため、キャプチャする必要はありません。また、スペースを入れる必要はありません[]

"^(?:[0-9A-Fa-f]{2} ){0,31}[0-9A-Fa-f]{2}$"

メソッドで大文字と小文字の区別を設定できますsetCaseSensitivity。に設定するとQt::CaseInsensitive、正規表現を少し短縮できます。

"^(?:[0-9a-f]{2} ){0,31}[0-9a-f]{2}$"
于 2013-01-29T14:05:19.637 に答える