Regulärer Ausdruck für eine Hexadezimalzahl?

113

Wie erstelle ich einen regulären Ausdruck, der Hexadezimalzahlen in einem Text erkennt?

Zum Beispiel '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3' und '8BADF00D'.

saurcery
quelle
1
Regex analysiert nicht wirklich. Versuchen Sie, alle zahlenähnlichen Dinge zu extrahieren und diejenigen herauszusieben, die keine Hexadezimalzahlen sind.
Blender

Antworten:

193

Wie wäre es mit folgendem?

0[xX][0-9a-fA-F]+

Entspricht dem Ausdruck, der mit einer 0 beginnt, gefolgt von einem x in Klein- oder Großbuchstaben, gefolgt von einem oder mehreren Zeichen in den Bereichen 0-9 oder af oder AF

Steven Schroeder
quelle
35
Das könnte auf /0x[\da-f]/i+1 gekürzt werden , aber ansonsten.
Niklas B.
20
@ NiklasB. Ihre Kurzschrift ist nur gültig, wenn Sie Perl-Regex verwenden. Wenn Sie POSIX-Regex verwenden, ist die Lösung von Steven die kürzeste. In beiden Fällen funktioniert die Lösung von Steven sowohl für Perl- als auch für POSIX-Regex.
David M. Syzdek
Verstanden! Die Lösung von Steven ist gut, wenn die Hex-Zahl mit 0x oder 0X beginnt. Dieser sollte besser funktionieren: ^ [0-9A-F] + $ Er kann auch Hex-Muster erkennen wie: '535GH0G73' Für Java können wir zB String.matches () verwenden, um dies zu überprüfen. Vielen Dank für die Antwort :)
saurcery
2
'0x [\ da-f] {2}' ist wahrscheinlich besser, um auch die Anzahl zu begrenzen
Yazan Rawashdeh
2
Würde das mit der zweiten und dritten Beispielnummer 0acdadecf822eeff32aca5830e438cb54aa722e3 und 8BADF00D übereinstimmen?
Peter Mortensen
43

Die genaue Syntax hängt von Ihren genauen Anforderungen und Ihrer Programmiersprache ab, aber im Grunde genommen:

/[0-9a-fA-F]+/

oder einfacher, imacht es unabhängig von Groß- und Kleinschreibung.

/[0-9a-f]+/i

Wenn Sie das Glück haben, Ruby zu verwenden, können Sie Folgendes tun:

/\h+/

BEARBEITEN - Steven Schroeders Antwort hat mir klar gemacht, dass mein Verständnis des 0x-Bits falsch war, deshalb habe ich meine Vorschläge entsprechend aktualisiert. Wenn Sie auch mit 0x übereinstimmen möchten, sind die Äquivalente

/0[xX][0-9a-fA-F]+/
/0x[0-9a-f]+/i
/0x[\h]+/i

MEHR HINZUGEFÜGT - Wenn 0x optional sein muss (wie die Frage impliziert):

/(0x)?[0-9a-f]+/i
SimonMayer
quelle
Kannst du mir den Grund für die obige RE erklären?
saurcery
4
@noobDroid Was genau soll ich erklären?
SimonMayer
18

Keine große Sache, aber die meisten Regex-Engines unterstützen die POSIX-Zeichenklassen, und es gibt [:xdigit:]passende Hex-Zeichen, was einfacher ist als die üblichen 0-9a-fA-FDinge.

Die angeforderte Regex (dh mit optional 0x) lautet also:/(0x)?[[:xdigit:]]+/

smathy
quelle
11

Dies wird mit oder ohne 0xPräfix übereinstimmen

(?:0[xX])?[0-9a-fA-F]+

Pawel Furmaniak
quelle
11

Es ist erwähnenswert, dass die Erkennung eines MD5 (eines der Beispiele) folgendermaßen erfolgen kann:

[0-9a-fA-F]{32}
Adaddinsane
quelle
5

Wenn Sie Perl oder PHP verwenden, können Sie ersetzen

[0-9a-fA-F]

mit:

[[:xdigit:]]
Joachim
quelle
Dies sollte eine in sich geschlossene Antwort sein.
Peter Mortensen
3

Nur für die Aufzeichnung würde ich Folgendes spezifizieren:

/^[xX]?[0-9a-fA-F]{6}$/

Was in unterscheidet , dass es überprüft, ob sie hat die sechs gültige Zeichen enthalten und auf Klein- oder Groß x , falls wir eine haben.

Fledermausspion
quelle
2

Wenn Sie nach einem bestimmten Hex-Zeichen in der Mitte der Zeichenfolge suchen, können Sie "\ xhh" verwenden, wobei hh das hexadezimale Zeichen ist. Ich habe es versucht und es funktioniert. Ich verwende Framework für C ++ Qt, aber es kann Probleme in anderen Fällen lösen, abhängig von der Art, die Sie verwenden müssen (PHP, Javascript, Python, Golang usw.).

Diese Antwort stammt von: http://ult-tex.net/info/perl/

Fábio Borges
quelle
Hallo! Während dies für Perl zutrifft, scheint dies bei regulären Ausdrücken nicht in allen Programmiersprachen der Fall zu sein. Nach diesem \x ist das Äquivalent zu \uin anderen Sprachen.
Maurice
Was ist "especific anda"?
Peter Mortensen
0

Dieser stellt sicher, dass Sie nicht mehr als drei gültige Paare haben:

(([a-fA-F]|[0-9]){2}){3}

Mehr oder weniger als drei Paare gültiger Zeichen stimmen nicht überein.

Lokale Bedürfnisse
quelle
0

Für den Fall , müssen Sie dies in einem Eingang , an dem der Benutzer eingeben kann 0und 0xauch , aber nicht eine Hex - Zahl ohne 0xPräfix:

^0?[xX]?[0-9a-fA-F]*$
Paul Razvan Berg
quelle
0

Ein weiteres Beispiel: Hexadezimalwerte für CSS-Farben beginnen mit einem Nummernzeichen oder einem Hash (#), dann mit sechs Zeichen, die entweder eine Ziffer oder ein Buchstabe zwischen A und F sein können.

^#[0-9a-fA-F]{6}
Tommy Vasquez
quelle