Expression régulière pour un nombre hexadécimal?

114

Comment créer une expression régulière qui détecte les nombres hexadécimaux dans un texte?

Par exemple, «0x0f4», «0acdadecf822eeff32aca5830e438cb54aa722e3» et «8BADF00D».

saurcerie
la source
1
Regex n'analyse pas vraiment. Essayez d'extraire toutes les choses semblables à des nombres et éliminez celles qui ne sont pas hexadécimales.
Blender

Réponses:

193

Que diriez-vous de ce qui suit?

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

Correspond à l'expression commençant par un 0, suivi d'un x minuscule ou majuscule, suivi d'un ou plusieurs caractères dans les plages 0-9, ou af ou AF

Steven Schroeder
la source
35
Cela pourrait être raccourci à /0x[\da-f]/i, mais sinon, +1.
Niklas B.
20
@NiklasB. Votre raccourci n'est valide que si vous utilisez perl regex, si vous utilisez POSIX regex, la solution de Steven est la plus courte. Dans tous les cas, la solution de Steven fonctionne à la fois pour perl et POSIX regex.
David M. Syzdek
Je l'ai! La solution de Steven est bonne si le nombre hexadécimal commence par 0x ou 0X. Celui-ci devrait mieux fonctionner: ^ [0-9A-F] + $ Il peut également reconnaître des motifs hexadécimaux comme: '535GH0G73' Pour Java, nous pouvons utiliser par exemple String.matches () pour vérifier cela .. Merci les gars pour la réponse :)
saurcery
2
'0x [\ da-f] {2}' il vaut mieux limiter le nombre aussi
Yazan Rawashdeh
2
Cela correspondrait-il aux deuxième et troisième numéros d'exemple, 0acdadecf822eeff32aca5830e438cb54aa722e3 et 8BADF00D?
Peter Mortensen
44

La syntaxe exacte dépend de vos exigences exactes et de votre langage de programmation, mais essentiellement:

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

ou plus simplement, le irend insensible à la casse.

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

Si vous avez la chance d'utiliser Ruby, vous pouvez faire:

/\h+/

EDIT - La réponse de Steven Schroeder m'a fait réaliser que ma compréhension du bit 0x était erronée, j'ai donc mis à jour mes suggestions en conséquence. Si vous souhaitez également faire correspondre 0x, les équivalents sont

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

AJOUT DE PLUS - Si 0x doit être facultatif (comme l'indique la question):

/(0x)?[0-9a-f]+/i
SimonMayer
la source
pouvez-vous m'expliquer la raison ci-dessus RE?
saurcery
4
@noobDroid Qu'aimeriez-vous que je vous explique précisément?
SimonMayer
18

Ce n'est pas grave, mais la plupart des moteurs regex supportent les classes de caractères POSIX, et il y a [:xdigit:]pour les caractères hexadécimaux correspondants, ce qui est plus simple que les 0-9a-fA-Fchoses courantes .

Ainsi, l'expression régulière demandée (c'est-à-dire avec facultatif 0x) est:/(0x)?[[:xdigit:]]+/

smathy
la source
11

Cela correspondra avec ou sans 0xpréfixe

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

Pawel Furmaniak
la source
11

Il est à noter que la détection d'un MD5 (qui est l'un des exemples) peut être effectuée avec:

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

Si vous utilisez Perl ou PHP, vous pouvez remplacer

[0-9a-fA-F]

avec:

[[:xdigit:]]
Joachim
la source
Cela devrait être une réponse autonome.
Peter Mortensen
3

Pour mémoire, je préciserais ce qui suit:

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

Ce qui diffère en ce qu'il vérifie qu'il doit contenir les six caractères valides et sur x minuscule ou majuscule au cas où nous en aurions un.

batspy
la source
2

Si vous recherchez un caractère hexadécimal spécifique au milieu de la chaîne, vous pouvez utiliser "\ xhh" où hh est le caractère hexadécimal. J'ai essayé et ça marche. J'utilise le framework pour C ++ Qt mais cela peut résoudre des problèmes dans d'autres cas, cela dépend de la saveur que vous devez utiliser (php, javascript, python, golang, etc.).

Cette réponse est tirée de: http://ult-tex.net/info/perl/

Fábio Borges
la source
Hey! Bien que cela puisse être vrai pour perl, cela ne semble pas être le cas pour les expressions régulières dans tous les langages de programmation. Selon cela, \x c'est l'équivalent \udans d'autres langues.
Maurice le
Qu'est-ce que "anda spécifique"?
Peter Mortensen
0

Celui-ci garantit que vous n'avez pas plus de trois paires valides:

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

Plus ou moins de trois paires de caractères valides ne correspondent pas.

Besoins locaux
la source
0

Au cas où vous en auriez besoin dans une entrée où l'utilisateur peut taper 0et 0xaussi mais pas un nombre hexadécimal sans le 0xpréfixe:

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

Un autre exemple: les valeurs hexadécimales pour les couleurs css commencent par un signe dièse ou dièse (#), puis six caractères qui peuvent être soit un chiffre, soit une lettre entre A et F, inclus.

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