web-dev-qa-db-fra.com

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
108
Xaisoft

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})$
233
netcoder

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é.)

19
pilcrow

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 ...
6
lioncub

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!

6
Vesselin Yanev

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})

4
Manohar Bhattarai

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.

4
tchrist

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}$
2
JYelton
/^(([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)
1
klashxx
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
1
stillstanding

pour PHP développeur 

filter_var($value, FILTER_VALIDATE_MAC)
1
Saurabh Chandra Patel

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

0
Robert Axelsen

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

0
bn00d

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.

0
user3807327

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.

0
PyFox

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

0
Tilo

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
0
MAChitgarha

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();             
}
0

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})$"
0
RexSplode