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'.
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'.
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 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.
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.