Rexact
Cheatsheet

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

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.