Risposte:
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})$
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).
: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.
:xdigit:(anche se "abbreviazione" è solo più breve di [a-fA-F0-9]ed equivalente /[a-f0-9]/iè più breve!)
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!
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!
aa.aa.bbbb.cccc, per esempio.
/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?)
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 ...
{1,2}regex
[0-9a-F]dovrebbe probabilmente essere riscritto come:[0-9a-fA-F]
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.
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})
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}$
La versione di Python potrebbe essere:
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})?$/
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
per sviluppatori PHP
filter_var($value, FILTER_VALIDATE_MAC)
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.
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();
}
Gente PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Hai bisogno di una spiegazione: http://regex101.com/r/wB0eT7
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
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
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}))$
Ed eccone uno aggiuntivo che consente l'uso di nessun separatore:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
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.
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])$