Regex adresse MAC
La réponse la plus votée sur Stack Overflow (346 votes) a un vrai défaut signalé en commentaire : elle accepte « 3D-F2-C9:A6-B3:4F », un mélange de tirets et de deux-points dans la même adresse, ce qui n'a aucun sens. Une autre réponse du même fil ne compile même pas en JavaScript (plage de caractères invalide dans une classe). Voici un motif qui impose un séparateur cohérent sur toute l'adresse, comparé à ces deux tentatives et à une troisième qui accepte des séparateurs incohérents groupe par groupe.
/^(?:[0-9A-Fa-f]{2}([:-]))(?:[0-9A-Fa-f]{2}\1){4}[0-9A-Fa-f]{2}$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse la plus votée (346 votes), accepte un mélange de tirets et de deux-points (bug signalé en commentaire) | ^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$ | 19 / 20 | sûr |
| Stack Overflow — réponse à 9 votes, variante sans le drapeau /i, plage de caractères a-F invalide (ne compile pas en JavaScript) | ^([0-9a-F]{1,2}[.:-]){5}([0-9a-F]{1,2})$ | ne compile pas | — |
| Stack Overflow — réponse « format Cisco » à 12 votes, séparateur optionnel indépendant par groupe (bug signalé en commentaire : accepte « aa.aa.bbbb.cccc ») | ^([0-9A-Fa-f]{2}[:.-]?){5}[0-9A-Fa-f]{2}$ | 16 / 20 | sûr |
Implémentation
const re = new RegExp("^(?:[0-9A-Fa-f]{2}([:-]))(?:[0-9A-Fa-f]{2}\\1){4}[0-9A-Fa-f]{2}$", "");
re.test(input);Limites
- N'accepte que le format standard IEEE 802 en 6 groupes de 2 chiffres hexadécimaux séparés par « : » ou « - » : ni la notation Cisco par points tous les 4 chiffres (« 0102.0304.abcd »), ni la forme sans séparateur (« 3DF2C9A6B34F »), pourtant réellement rencontrées, ne sont couvertes.
- N'accepte pas les groupes à un seul chiffre (« 3D:F2:C9:A6:B3:4 » pour un octet inférieur à 0x10) que certains outils Unix produisent en supprimant le zéro de tête — un vrai comportement documenté dans les commentaires du fil source.
- Valide uniquement la FORME : ne vérifie pas que l'adresse correspond à un préfixe OUI (les 3 premiers octets) réellement attribué par l'IEEE à un fabricant.
- Ne distingue pas les adresses réservées (diffusion FF:FF:FF:FF:FF:FF, multicast, ou l'adresse nulle 00:00:00:00:00:00) : elles sont syntaxiquement valides mais ne désignent pas une interface réseau individuelle.