Dans ce format:
3D:F2:C9:A6:B3:4F
ou:
3D-F2-C9-A6-B3-4F
Le format standard (IEEE 802) pour impression des adresses MAC-48 au format forme humaine est six groupes de deux chiffres hexadécimaux, séparés par traits d'union
-
ou deux-points:
.
Alors:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Un peu dur aux yeux, mais ceci:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
appliquera tous les deux points ou tous les tirets à votre notation MAC.
(Une approche plus simple utilisant une expression rationnelle pourrait permettre à A1:B2-C3:D4-E5:F6
, par exemple, que ce qui précède est rejeté.)
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 ...
Cette expression rationnelle correspond à peu près à tous les formats Mac, y compris ceux de Cisco tels que 0102-0304-abcd
^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$
Exemple de chaînes auxquelles elle correspond:
01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd
Format mixte sera jumelé aussi!
Ce link 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})
Soyez averti que la propriété Unicode \p{xdigit}
inclut les versions FULLWIDTH. Vous préférerez peut-être \p{ASCII_Hex_Digit}
à la place.
Il serait peut-être préférable de répondre à la question posée - à condition d'installer un vénérable module CPAN - en tapant:
% Perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
Je montre le motif particulier qu’il affiche ici sous le 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.
Voir cette question aussi.
Les regex 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}$
/^(([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})?$/
La 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
La version python pourrait être:
re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
pour PHP développeur
filter_var($value, FILTER_VALIDATE_MAC)
Merci beaucoup à @Moshe _ pour la excellente réponse ci-dessus. Après des recherches plus approfondies, j'aimerais ajouter mes conclusions supplémentaires, à la fois en ce qui concerne IEEE 802 et l'application stricte de l'utilisation d'un séparateur cohérent dans regex.
Le format standard (IEEE 802) pour l’impression des adresses MAC-48 au format La forme humaine est composée de six groupes de deux chiffres hexadécimaux, séparés par tirets -. Cependant, il est généralement admis que colon:, et trois groupes de quatre chiffres hexadécimaux séparés par points..
Tout crédit à @Moshe ici pour sa déclaration initiale et à @pilcrow pour soulignant que IEEE 802 ne couvre que les têtes.
Voici une regex 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 de 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 de Regex101
Les gens de PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Besoin d'explication: http://regex101.com/r/wB0eT7
Comme une adresse MAC peut avoir 6 ou 20 octets (bande infinie, ...), la réponse correcte 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.
Je ne pense pas que le RegEx principal est correct car il classe également
'3D-F2-C9:A6-B3:4F'
comme 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 l’adresse MAC complète.
pour correspondre aux adresses MAC EUI-48 à 48 bits et EUI-64 à 64 bits:
/\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
Peut-être le plus court possible:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
Update: il existe un meilleur moyen de valider les adresses MAC dans 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
Vous pouvez utiliser la procédure suivante en passant l'adresse mac pour la 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();
}
Si vous avez besoin d'espaces entre les nombres, comme cette variante
3D : F2 : C9 : A6 : B3 : 4F
La regex change en
"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"