Regex MAC address
Stack Overflow's top-voted answer (346 votes) has a real flaw flagged in the comments: it accepts "3D-F2-C9:A6-B3:4F", a mix of hyphens and colons within the same address, which makes no sense. Another answer in the same thread doesn't even compile in JavaScript (an invalid character range inside a class). Here's a pattern that enforces one consistent separator across the whole address, compared against both of those attempts and a third that accepts inconsistent separators group by group.
/^(?:[0-9A-Fa-f]{2}([:-]))(?:[0-9A-Fa-f]{2}\1){4}[0-9A-Fa-f]{2}$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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})$ | does not compile | — |
| 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 | safe |
Implementation
const re = new RegExp("^(?:[0-9A-Fa-f]{2}([:-]))(?:[0-9A-Fa-f]{2}\\1){4}[0-9A-Fa-f]{2}$", "");
re.test(input);Limits
- 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.