Qu'est-ce qu'une expression régulière pour une adresse MAC?


125

Dans ce format:

3D:F2:C9:A6:B3:4F

ou:

3D-F2-C9-A6-B3-4F

Réponses:


267

Le format standard (IEEE 802) pour l'impression d'adresses MAC-48 sous une forme conviviale est six groupes de deux chiffres hexadécimaux, séparés par des tirets -ou des deux-points :.

Alors:

^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$

21
Notez que s'ils sont stockés avec des lettres hexadécimales minuscules, cela ne correspondra pas, changez le groupe en [0-9A-Fa-f] pour attraper les deux cas
Scott Chamberlain

5
vous voulez probablement aussi ignorer l'enveloppe
dietbuddha

5
^ ([0-9A-Fa-f] {2} [: -]) {5} ([0-9A-Fa-f] {2}) $
Rajavel D

2
En passant, la citation ci-dessus concernant le "format standard" vient de Wikipedia, et non de l'organisme de normalisation 802.3. IEEE 802-2014 spécifie en fait des traits d' union pour les adresses MAC ordinaires (§ 8.1 ¶ 3) et des deux - points pour la notation obsolescente à bits inversés (¶ 4). Surtout, dans la pratique, personne ne l'observe . Nous utilisons simplement l'un ou l'autre, mais ne les mélangeons jamais dans un seul MAC écrit.
pilcrow

1
Je ne pense pas que ce RegEx soit correct car il classe également '3D-F2-C9: A6-B3: 4F' comme une adresse MAC valide, même si elle n'est pas correcte. Le bon serait: ((([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | (([a- zA-z0-9] {2}:) {5} ([a-zA-z0-9] {2}))) Pour que vous puissiez à chaque fois choisir ':' ou '-' pour toute l'adresse MAC.
PyFox

23

Un peu dur pour les yeux, mais ceci:

/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/

appliquera tous les deux-points ou tous les tirets pour votre notation MAC.

(Une approche regex plus simple pourrait permettre A1:B2-C3:D4-E5:F6, par exemple, ce que ce qui précède rejette.)


Cela fonctionne, mais pouvez-vous expliquer ce qu'est: xdigit? et j'ai remarqué que vous mettez le groupe ([-:]) après la longueur, qu'est-ce qui fait que cela prend soit tous les deux-points, soit les tirets?
Xaisoft

2
@Xaisoft, :xdigit:est l'abréviation de hexadécimal, plus ou moins une autre façon de dire [a-fA-F0-9]. Le \1fait référence au groupe de capture pour le premier tiret ou deux ([-:])- points et correspond uniquement à ce qui correspond à la première fois.
Pilcrow

2
+1 pour utiliser à la fois les groupes de capture et non-capture de manière appropriée, et aussi pour l'utilisation :xdigit:(même si ce "raccourci" est juste plus court [a-fA-F0-9]et son équivalent /[a-f0-9]/iest plus court!)
gb96

@pilcrow pourriez-vous s'il vous plaît expliquer pourquoi ce mac: C8:FD:19:55:E6:3Aéchoue? C'est une véritable adresse Mac. J'ai modifié votre regex pour n'accepter :que /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/Merci!
Sam

1
Dans mon esprit, c'est la meilleure réponse car elle vérifie en fait l'utilisation mixte de ":" et "-".
Ray Oei

9

Cette expression régulière correspond à presque tous les formats Mac, y compris le format Cisco, tel que 0102-0304-abcd

^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$

Exemple de chaînes auxquelles il correspond:

01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd

Le format mixte sera également adapté!


Cela correspondra aux séparateurs après l'un des cinq premiers octets, ce qui signifie qu'il acceptera aa.aa.bbbb.cccc, par exemple.
Pilcrow

1
#notAllFormats Si vous avez accès à un système OSX avec WiFi, exécutez /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Iet recherchez la ligne BSSID, si un octet est sous 0x10, le zéro est supprimé ( %xou %2xplutôt que le %02x printfformat utilisé?)
nhed

8

délimiteur: " : ", " - ", " . "

double ou simple: 00 = 0, 0f = f

/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i

ou

/^([0-9a-F]{1,2}[\.:-]){5}([0-9a-F]{1,2})$/


exm: 00:27:0e:2a:b9:aa, 00-27-0E-2A-B9-AA, 0.27.e.2a.b9.aa ...

2
Le second ne correspondra pas correctement aux chaînes contenant des caractères non hexadécimaux tels que g.
Binary Phile

Le second n'est pas valide dans la plupart des versions, à l'exception de BRE / ERE, qui prend en charge le classement des plages de caractères. Cependant, la prise en charge du classement des plages de caractères varie selon l'implémentation, de sorte que le résultat peut varier.
nhahtdh

Une autre chose est que les groupes doivent avoir exactement 2 chiffres hexadécimaux.
nhahtdh

En théorie, toutes les adresses mac renvoyées par des programmes dans la nature suivraient une norme comme 2 chiffres hexadécimaux dans chaque groupe séparé. Cependant, certaines variantes Unix non standardisées raccourcissent la sortie lorsqu'il y a un zéro non significatif, ne laissant qu'un seul caractère hexadécimal dans certains cas. D'où la nécessité de l' {1,2}expression régulière
TrinitronX

Cependant, le jeu de caractères de [0-9a-F]devrait probablement être réécrit comme suit:[0-9a-fA-F]
TrinitronX

5

Soyez averti que la propriété Unicode \p{xdigit}inclut les versions FULLWIDTH. Vous pourriez préférer à la \p{ASCII_Hex_Digit}place.

La réponse à la question posée pourrait être mieux répondue - à condition que vous ayez un certain module vénérable CPAN installé - en tapant:

% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'

Je montre le modèle particulier qu'il produit ici comme le modèle chanceux numéro 13; il y en a beaucoup d'autres.

Ce programme:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings qw<FATAL all>;

my $mac_rx = qr{
    ^ (?&MAC_addr) $
    (?(DEFINE)
        (?<MAC_addr>
                (?&pair) (?<it>  (?&either) )
            (?: (?&pair) \k<it> ) {4}
                (?&pair)
        )
        (?<pair>    [0-9a-f] {2} )
        (?<either>  [:\-]        )
    )
}xi;

while (<DATA>) {
    chomp;
    printf("%-25s %s\n", $_ => /$mac_rx/ ? "ok" : "not ok");
}

__END__
3D:F2:C9:A6:B3:4F
3D:F2:AC9:A6:B3:4F
3D:F2:C9:A6:B3:4F:00
:F2:C9:A6:B3:4F
F2:C9:A6:B3:4F
3d:f2:c9:a6:b3:4f
3D-F2-C9-A6-B3-4F
3D-F2:C9-A6:B3-4F

génère cette sortie:

3D:F2:C9:A6:B3:4F         ok
3D:F2:AC9:A6:B3:4F        not ok
3D:F2:C9:A6:B3:4F:00      not ok
:F2:C9:A6:B3:4F           not ok
F2:C9:A6:B3:4F            not ok
3d:f2:c9:a6:b3:4f         ok
3D-F2-C9-A6-B3-4F         ok
3D-F2:C9-A6:B3-4F         not ok

Ce qui semble être le genre de chose que vous recherchez.


5

Ce lien pourrait vous aider. Vous pouvez utiliser ceci:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})


4

Voir aussi cette question .

Regexes comme suit:

^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$

^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$

1
N'y a-t-il pas un moyen de le raccourcir en faisant des groupes? et comment puis-je combiner l'expression régulière pour avoir un: ou un - sans avoir 2 expressions régulières séparées?
Xaisoft

La forme abrégée fournie par netcoder fonctionnera également. L'utilisation de l'un ou de l'autre peut être basée sur le fait que vous devez capturer l'une des adresses MAC ou simplement la valider dans son ensemble.
JYelton

Il doit être validé dans son ensemble, donc s'il contient tous les tirets ou tous les deux-points. S'il contient un mix, ce n'est pas un MAC valide.
Xaisoft

2
@Xaisoft: Comme je l'ai dit dans le commentaire de ma réponse, mélanger les deux points et les tirets est valide selon la spécification.
netcoder

De quelle source obtenez-vous des adresses MAC qui pourraient avoir un mélange de délimiteurs? S'ils proviennent d'une machine / carte réseau réelle, vous n'aurez probablement pas ce problème. S'il s'agit de données entrées par l'utilisateur, effectuez simplement un remplacement de chaîne pour rendre tous les délimiteurs cohérents.
JYelton

2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/

Est-ce similaire à la réponse de Pilcrow, juste sans le: xdigit?
Xaisoft


2
/^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$/

Le regex ci-dessus valide tous les types d'adresses mac ci-dessous:

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab

Je pense que c'est le seul qui soit complet et correct.
Vincent Sels


1

Merci beaucoup à @Moshe pour l' excellente réponse ci-dessus. Après avoir fait quelques recherches, j'aimerais ajouter mes découvertes supplémentaires, à la fois en ce qui concerne IEEE 802 et en imposant une utilisation cohérente des séparateurs dans les regex.

Le format standard (IEEE 802) pour l'impression d'adresses MAC-48 sous une forme conviviale est six groupes de deux chiffres hexadécimaux, séparés par des tirets - . Cependant, une convention largement adoptée autorise également deux points: et trois groupes de quatre chiffres hexadécimaux séparés par des points. .

Merci à @Moshe ici pour sa déclaration initiale, et à @pilcrow pour avoir souligné que IEEE 802 ne couvre que les hypens.

Voici une expression régulière qui impose que le même séparateur soit utilisé dans toute l'adresse mac:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$

Démo Regex101

Et voici un autre qui permet de ne pas utiliser de séparateur du tout:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$

Démo Regex101


1

Je ne pense pas que le RegEx principal soit correct car il classe également

'3D-F2-C9:A6-B3:4F' 

comme une adresse MAC valide, même si elle n'est pas correcte. Le bon serait:

((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))

Ainsi, à chaque fois, vous pouvez choisir «:» ou «-» pour toute l'adresse MAC.


0

Vous pouvez utiliser la procédure suivante en passant l'adresse mac pour validation,

private static final String MAC_PATTERN = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$";

private boolean validateMAC(final String mac){          
    Pattern pattern = Pattern.compile(MAC_PATTERN);
    Matcher matcher = pattern.matcher(mac);
    return matcher.matches();             
}


0

Si vous avez besoin d'espaces entre les nombres, comme cette variante

3D : F2 : C9 : A6 : B3 : 4F

L'expression régulière change en

"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"

0

pour faire correspondre les adresses MAC 48 bits EUI-48 et 64 bits EUI-64:

/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/

où \ h est un caractère dans [0-9a-fA-F]

ou:

/\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){5}\z|\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){7}\z/

cela permet d'utiliser '-' ou ':' ou aucun séparateur


0

Peut-être le plus court possible:

/([\da-f]{2}[:-]){5}[\da-f]{2}/i

Mise à jour : Il existe un meilleur moyen de valider les adresses MAC en PHP qui prend en charge les adresses MAC de style tiret et deux-points. Utilisez filter_var () :

// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);

Comme je le sais, il prend en charge les adresses MAC sous ces formes (x: un nombre hexadécimal):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx

0

Comme une adresse MAC peut être de 6 ou 20 octets (infiniband, ...) la bonne réponse est:

^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$

vous pouvez remplacer: par [: -.]? si vous voulez des séparateurs différents ou aucun.


-1

Celui-ci est petit:

(([0-9A-F]{2}[:-]?){6})

Gardez à l'esprit que ce mélange étrange de plusieurs caractères ou séparateurs pourrait passer.


-4

la meilleure réponse est pour la regex de validation d'adresse mac

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.