Qu'est-ce qu'une expression régulière pour une adresse MAC?
Dans ce format:
3D:F2:C9:A6:B3:4F
Ou:
3D-F2-C9-A6-B3-4F
17 réponses
Le format standard (IEEE 802) pour impression D'adresses MAC-48 dans la forme humaine-amicale est six groupes de deux chiffres hexadécimaux séparés par tirets
-
ou deux-points:
.
Donc:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Un PEU DUR sur les yeux, mais ceci:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
Appliquera tous les deux-points ou tous les tirets pour la notation MAC.
(une approche regex plus simple pourrait permettre A1:B2-C3:D4-E5:F6
, par exemple, que ce qui précède rejette.)
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 regex correspond à peu près tous les formats mac, y compris le format Cisco tels 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é!
Soyez averti que la propriété Unicode \p{xdigit}
inclut les versions pleine largeur. Vous pourriez préférer \p{ASCII_Hex_Digit}
à la place.
La réponse à la question posée peut être mieux répondu-à condition que vous ayez un certain vénérable module CPAN installé-en tapant:
% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
Je montre le modèle particulier qu'il produit ici {[11] } comme 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 vous êtes à la recherche pour.
Ce lien peut 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})
Voir cette question aussi.
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}$
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}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$/
L'expression régulière 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
Pour le développeur PHP
filter_var($value, FILTER_VALIDATE_MAC)
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();
}
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'une Explication: http://regex101.com/r/wB0eT7
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})$"
Pour faire correspondre les adresses MAC eui-48 et EUI-64 48 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 en PHP qui prend en charge les adresses MAC de style trait d'Union et deux-points. Utiliser 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
La meilleure réponse est pour la validation d'adresse MAC regex
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$