151 votes

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

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

Par exemple, '0x0f4', '0acdadecf822eeff32aca5830e438cb54aa722e3', et '8BADF00D'.

2 votes

Regex ne parse pas vraiment. Essayez d'extraire tout ce qui ressemble à un nombre et de filtrer ceux qui ne sont pas des hexadécimaux.

1voto

Sven Points 641

En Java, cela est autorisé :

(?:0x?)?[\p{XDigit}]+$

Comme vous pouvez le voir, le 0x est facultatif (même le x est facultatif) dans un groupe non capturant.

0voto

Paul Berg Points 567

Si vous avez besoin de cela dans un champ de saisie où l'utilisateur peut taper 0 et 0x aussi mais pas un nombre hexadécimal sans le préfixe 0x:

^0?[xX]?[0-9a-fA-F]*$

0 votes

Avec cette solution, vous permettez x sans le 0 initial. Vous devriez les regrouper, pour vous assurer de ne pas obtenir le x sans un 0. Ainsi, dans l'exemple, cela devrait être ^(?:0[xX]?)?[0-9a-fA-F]*$.

0voto

Michał Kawiecki Points 135

Tout d'abord, au lieu de ^ et $ utilisez \b car c'est un délimiteur de mot et peut aider lorsque le hash n'est pas la seule chaîne dans la ligne.

je suis venu ici à la recherche d'une regex similaire mais spécialisée et j'ai trouvé ceci :

\b(\d+[a-f]+\d+[\da-f]*|[a-f]+\d+[a-f]+[\da-f]*)\b

J'avais besoin de détecter des hachages comme les identifiants de commit git (et similaires) dans la console et donc, au lieu de faire correspondre tous les hachages possibles, je donne la priorité à ne PAS correspondre à des mots aléatoires ou des numéros comme EB ou 12345678

Donc, une approche heuristique que j'ai choisie est que je suppose qu'un hachage alternera raisonnablement souvent entre chiffres et lettres et que les chaînes contenant seulement des chiffres ou seulement des lettres seront courtes.

Un autre fait important est que le hachage MD5 fait 32 caractères (comme mentionné par @Adaddinsane) et git affiche une version raccourcie avec seulement 10 caractères, donc l'exemple ci-dessus peut être modifié comme suit :

pour les hachages de 10 caractères de long, je suppose que les groupes auront au plus 3 caractères de long

\b(\d+[a-f]+\d+[\da-f]{1,7}|[a-f]+\d+[a-f]+[\da-f]{1,7})\b

pour des hachages allant jusqu'à 32 caractères de long, je suppose que les groupes seront au plus 5 caractères de long

\b(\d+[a-f]+\d+[\da-f]{17,29}|[a-f]+\d+[a-f]+[\da-f]{17,29})\b

vous pouvez facilement changer a-f en a-fA-F pour l'insensibilité à la casse ou ajouter 0[xX] au début pour faire correspondre le préfixe 0x

ces exemples ne correspondront évidemment pas aux hachages exotiques mais valides qui ont de très longues séquences de seulement des chiffres ou seulement des lettres à l'avant ou des hachages extrêmes comme seulement des 0 mais de cette manière je peux correspondre aux hachages et réduire considérablement les correspondances accidentelles de faux positifs, comme le nom de répertoire ou le numéro de ligne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X