2008-11-13 28 views
14

Ich verwende diesen einfachen regulären Ausdruck zu validieren einen Hex-String zu validieren:Regulärer Ausdruck Hexstring

^[A-Fa-f0-9]{16}$ 

Wie Sie sehen, ich bin mit einem Quantor zu bestätigen, dass die Zeichenfolge 16 Zeichen lang ist . Ich habe mich gefragt, ob ich einen anderen Quantifizierer in der gleichen Regex verwenden kann, um die Stringlänge auf 16 oder 18 (nicht 17) zu überprüfen.

Antwort

50

Ich glaube

^([A-Fa-f0-9]{2}){8,9}$ 

arbeiten.

Das ist nett, weil es auf jede gleich lange Zeichenfolge verallgemeinert wird.

+0

ich stimme zu, dass upvotes verdient –

+0

Gutes Denken! +1 – Tomalak

+0

Ich stimme zu, besser: +1 (wenn Alonso das "Zecke" -Lösungszeichen lieber auf diese Antwort setzen möchte als auf meine, würde ich das verstehen;)) – VonC

5
^(?:[A-Fa-f0-9]{16}|[A-Fa-f0-9]{18})$ 
9

Das ist nur eine 16-Zeichen-Anforderung mit einem optionalen 2 Charakter danach:

^[A-Fa-f0-9]{16}([A-Fa-f0-9]{2})?$ 

Die Klammern nicht erforderlich sein können - ich bin nicht genug von einem regex Guru weiß offhand, ich bin Angst. Wenn jemand will, um sie bearbeiten, fühlen Sie sich frei ...

+0

Vom Leistungspunkt ist dies * viel * besser. Wesentlich weniger Backtracking bei einer Nicht-Übereinstimmung. +1 – Tomalak

+0

Klammern sind hier erforderlich. Wenn Sie sie weglassen, die? macht die {2} faul, was hier keinen Effekt hat. –

0

würde ich wahrscheinlich mit

/^[a-f0-9]{16}([a-f0-9]{2})?$/i 

mich gehen. Ich denke, es ist besser lesbar, wenn die Regex nicht zwischen Groß- und Kleinschreibung unterscheidet und nur einmal den Zeichenbereich auflistet. Das heißt, fast alle diese Antworten funktionieren.

+0

Wie so viele Dinge, es ist ein Kompromiss .../[a-f]/ich kann besser lesbar sein (oder vielleicht nicht, je nach Leser), aber/[A-Fa-f]/wird schneller laufen. Wahrscheinlich nicht genug von einem Leistungsunterschied, um in diesem Fall jedoch relevant zu sein. –