Réponses:
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})$
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.)
:xdigit:
est l'abréviation de hexadécimal, plus ou moins une autre façon de dire [a-fA-F0-9]
. Le \1
fait référence au groupe de capture pour le premier tiret ou deux ([-:])
- points et correspond uniquement à ce qui correspond à la première fois.
:xdigit:
(même si ce "raccourci" est juste plus court [a-fA-F0-9]
et son équivalent /[a-f0-9]/i
est plus court!)
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!
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é!
aa.aa.bbbb.cccc
, par exemple.
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
et recherchez la ligne BSSID, si un octet est sous 0x10, le zéro est supprimé ( %x
ou %2x
plutôt que le %02x
printf
format utilisé?)
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 ...
{1,2}
expression régulière
[0-9a-F]
devrait probablement être réécrit comme suit:[0-9a-fA-F]
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.
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})
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}$
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})?$/
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
pour développeur PHP
filter_var($value, FILTER_VALIDATE_MAC)
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}))$
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}))$
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.
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();
}
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'explications: http://regex101.com/r/wB0eT7
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
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
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.
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])$