Che cos'è un'espressione regolare per un indirizzo MAC?


125

In questo formato:

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

o:

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

Risposte:


266

Il formato standard (IEEE 802) per la stampa di indirizzi MAC-48 in forma a misura d'uomo è sei gruppi di due cifre esadecimali, separati da trattini -o due punti :.

Così:

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

21
Si noti che se vengono archiviati con lettere esadecimali minuscole, non corrisponderà cambiare il gruppo in [0-9A-Fa-f] per catturare entrambi i casi
Scott Chamberlain,

5
probabilmente vorrai anche ignorare l'involucro
dietbuddha,

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

2
A parte questo, la citazione di cui sopra relativa al "formato standard" proviene da Wikipedia, non dall'ente standard 802.3. IEEE 802-2014 specifica in realtà trattini per indirizzi MAC ordinari (§ 8.1 ¶ 3) e due punti per la notazione obsoleta bit-reverse (¶ 4). È importante sottolineare che, in pratica, nessuno lo osserva . Usiamo semplicemente l'uno o l'altro, ma non li mescoliamo mai in un singolo MAC scritto.
Pilcrow

1
Non penso che questo RegEx sia corretto in quanto classifica anche "3D-F2-C9: A6-B3: 4F" come un indirizzo MAC valido, anche se non è corretto. Quello corretto sarebbe: (((([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | ((([a- zA-z0-9] {2}:) {5} ([a-zA-z0-9] {2}))) In modo che ogni volta tu possa scegliere ':' o '-' per l'intero indirizzo MAC.
PyFox,

23

Un po 'duro per gli occhi, ma questo:

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

imporrà tutti i due punti o tutti i trattini per la notazione MAC.

(Un approccio regex più semplice potrebbe consentire A1:B2-C3:D4-E5:F6, ad esempio, che il precedente rifiuto).


Funziona, ma puoi spiegare cosa: xdigit è? e ho notato che hai inserito il gruppo ([-:]) dopo la lunghezza, che cosa rende questo prendere tutti i due punti o trattini?
Xaisoft,

2
@Xaisoft, :xdigit:è l'abbreviazione di cifre esadecimali, più o meno un altro modo di dire [a-fA-F0-9]. Si \1riferisce al gruppo di acquisizione per il primo trattino o due punti ([-:])e corrisponde solo a ciò che corrisponde quella prima volta.
Pilcrow

2
+1 per utilizzare i gruppi di acquisizione e non di acquisizione in modo appropriato e anche per l'utilizzo :xdigit:(anche se "abbreviazione" è solo più breve di [a-fA-F0-9]ed equivalente /[a-f0-9]/iè più breve!)
gb96

@pilcrow potresti spiegare perché questo mac: C8:FD:19:55:E6:3Afallisce? È un vero indirizzo mac. Ho modificato il tuo regex per accettare :solo /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/grazie!
Sam

1
Nella mia mente questa è la risposta migliore in quanto controlla effettivamente l'uso misto di ":" e "-".
Ray Oei,

9

Questa regex si adatta praticamente a tutti i formati mac, incluso Cisco come 0102-0304-abcd

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

Stringhe di esempio che corrispondono:

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

Anche il formato misto verrà abbinato!


Questo abbinerà i separatori dopo uno dei primi cinque ottetti, il che significa che accetterà aa.aa.bbbb.cccc, per esempio.
Pilcrow

1
#notAllFormats Se hai accesso a un sistema OSX con WiFi, esegui /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Ie cerca la linea BSSID, se qualche ottetto è inferiore a 0x10 viene eliminato lo zero iniziale ( %xo %2xpiuttosto che il %02x printfformato utilizzato?)
nhed

8

delimitatore: " : ", " - ", " . "

doppio o singolo: 00 = 0, 0f = f

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

o

/^([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
Il secondo abbinerà erroneamente le stringhe che contengono caratteri non esadecimali come g.
File binario,

Il secondo non è valido nella maggior parte dei gusti, ad eccezione di BRE / ERE, che supporta la raccolta di intervalli di caratteri. Tuttavia, il supporto per le regole di confronto della gamma di caratteri varia a seconda dell'implementazione, quindi il risultato può variare.
nhahtdh,

Un'altra cosa è che i gruppi devono avere esattamente 2 cifre esadecimali.
nhahtdh,

In teoria tutti gli indirizzi mac restituiti dai programmi in ambiente naturale seguiranno alcuni standard come 2 cifre esadecimali in ciascun gruppo separato. Tuttavia, alcune varianti Unix non standardizzate accorciano l'output in presenza di uno zero iniziale, lasciando in alcuni casi solo 1 carattere esadecimale. Da qui la necessità del {1,2}regex
TrinitronX,

Tuttavia, il set di caratteri da [0-9a-F]dovrebbe probabilmente essere riscritto come:[0-9a-fA-F]
TrinitronX

5

Tieni presente che la proprietà Unicode \p{xdigit}include le versioni FULLWIDTH. Potresti preferire\p{ASCII_Hex_Digit} invece.

La risposta alla domanda posta potrebbe essere la migliore risposta - a condizione che sia installato un certo modulo CPAN venerabile - digitando:

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

Mostro lo schema particolare che emette qui come schema fortunato numero 13; ce ne sono molti altri.

Questo programma:

#!/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

genera questo output:

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

Che sembra il tipo di cosa che stai cercando.


5

Questo link potrebbe aiutarti. Puoi usare questo:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})


4

Vedi anche questa domanda .

Ricalca come segue:

^[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
Non c'è modo di accorciarlo facendo gruppi? e come posso combinare il regex per avere a: o a - senza avere 2 espressioni regolari separate?
Xaisoft,

Funzionerà anche la forma abbreviata fornita da netcoder. L'utilizzo dell'uno o dell'altro potrebbe basarsi sulla necessità di acquisire uno qualsiasi degli indirizzi MAC o semplicemente di validarlo nel suo complesso.
JYelton,

Deve essere validato nel suo insieme, quindi se contiene tutti i trattini o tutti i due punti. Se contiene un mix, non è un MAC valido.
Xaisoft,

2
@Xaisoft: Come ho detto nel commento della mia risposta, la miscelazione di due punti e trattini è valida in base alle specifiche.
netcoder il

Da quale fonte stai ricevendo gli indirizzi MAC che potrebbero avere un mix di delimitatori? Se provengono da una macchina / scheda NIC reale, probabilmente non avrai questo problema. Se si tratta di dati immessi dall'utente, basta eseguire una sostituzione di stringa per rendere coerenti tutti i delimitatori.
JYelton,

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

È simile alla risposta di Pilcrow, solo senza: 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})?$/

La regex sopra convalida tutti i tipi di indirizzi mac di seguito:

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

Penso che questo sia l'unico completo e corretto.
Vincent Sels,


1

Non penso che il RegEx principale sia corretto in quanto classifica anche

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

come un indirizzo MAC valido, anche se non è corretto. Quello corretto sarebbe:

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

In modo che ogni volta sia possibile scegliere ':' o '-' per l'intero indirizzo MAC.


0

Puoi utilizzare la seguente procedura passando l'indirizzo mac per la convalida,

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

Se hai bisogno di spazi tra i numeri, come questa variante

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

Le regex modifiche a

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

0

per abbinare entrambi gli indirizzi MAC EUI-64 a 48 bit e EUI-64 a 64 bit:

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

dove \ h è un personaggio in [0-9a-fA-F]

o:

/\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/

ciò consente di utilizzare '-' o ':' o nessun separatore


0

Forse il più breve possibile:

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

Aggiornamento : esiste un modo migliore per convalidare gli indirizzi MAC in PHP che supporta indirizzi MAC sia in stile trattino che in stile colon. Usa filter_var () :

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

Come so, supporta gli indirizzi MAC in queste forme (x: un numero esadecimale):

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

0

Grazie mille a @Moshe per l' ottima risposta sopra. Dopo aver fatto qualche ricerca in più, vorrei aggiungere i miei risultati extra, sia per quanto riguarda IEEE 802 sia per l'applicazione coerente del separatore in regex.

Il formato standard (IEEE 802) per la stampa di indirizzi MAC-48 in forma a misura d'uomo è sei gruppi di due cifre esadecimali, separati da trattini - . Tuttavia, è una convenzione ampiamente adottata per consentire anche i due punti: e tre gruppi di quattro cifre esadecimali separati da punti . .

Tutto merito a @Moshe qui per la sua dichiarazione iniziale e a @pilcrow per aver sottolineato che IEEE 802 copre solo gli hypens.

Ecco una regex che impone che lo stesso separatore venga utilizzato in tutto l'indirizzo mac:

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

Demo Regex101

Ed eccone uno aggiuntivo che consente l'uso di nessun separatore:

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

Demo Regex101


0

Poiché un indirizzo MAC può essere di 6 o 20 byte (infiniband, ...) la risposta corretta è:

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

puoi sostituire: con [: -.]? se si desidera separatori diversi o nessuno.


-1

Questo è piccolo:

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

Tieni presente che potrebbe passare quello strano mix di diversi caratteri o separatori.


-4

la risposta migliore è per regex di convalida dell'indirizzo mac

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.