Odpowiedzi:
Standardowy format (IEEE 802) do drukowania adresów MAC-48 w formie przyjaznej dla człowieka to sześć grup po dwie cyfry szesnastkowe, oddzielone myślnikami
-
lub dwukropkami:
.
Więc:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Trochę ciężko dla oczu, ale to:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
wymusi użycie wszystkich dwukropków lub wszystkich myślników w notacji MAC.
(Na przykład prostsze podejście do wyrażeń regularnych może pozwolić A1:B2-C3:D4-E5:F6
, które powyższe odrzuca).
:xdigit:
to skrót od cyfry szesnastkowej, mniej więcej inaczej mówiąc [a-fA-F0-9]
. \1
Odnosi się do grupy przechwytującej pierwszej desce rozdzielczej lub okrężnicy ([-:])
, i tylko pasuje co dopasowane, że po raz pierwszy.
:xdigit:
(chociaż to „skrót” jest tylko krótsze, [a-fA-F0-9]
a odpowiednik /[a-f0-9]/i
krótszy!)
C8:FD:19:55:E6:3A
nie działa? To rzeczywisty adres MAC. Zmodyfikowałem Twoje wyrażenie regularne, aby akceptować :
tylko /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
dzięki!
To wyrażenie regularne pasuje do prawie każdego formatu Mac, w tym formatu Cisco, takiego jak 0102-0304-abcd
^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$
Przykładowe ciągi, do których pasuje:
01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd
Dopasowany zostanie również format mieszany!
aa.aa.bbbb.cccc
na przykład zaakceptuje .
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
i poszukaj linii BSSID, jeśli którykolwiek oktet ma mniej niż 0x10 wiodącego zera jest usuwany ( %x
lub %2x
raczej niż %02x
printf
używany format?)
Separator: " : ", " - " " "
podwójny lub pojedynczy: 00 = 0, 0f = f
/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i
lub
/^([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}
wyrażenia regularnego
[0-9a-F]
powinien prawdopodobnie zostać przepisany jako:[0-9a-fA-F]
Ostrzegamy, że właściwość Unicode \p{xdigit}
obejmuje wersje FULLWIDTH. Wolisz \p{ASCII_Hex_Digit}
zamiast tego.
Najlepszą odpowiedzią na zadane pytanie może być - pod warunkiem, że masz zainstalowany pewien czcigodny moduł CPAN - wpisując:
% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
Pokazuję konkretny wzorzec, który wyprowadza tutaj jako szczęśliwy wzorzec numer 13; jest wiele innych.
Ten program:
#!/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
generuje ten wynik:
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
Co wydaje się być czymś, czego szukasz.
Ten link może ci pomóc. Możesz użyć tego:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})
Zobacz również to pytanie .
Regexes w następujący sposób:
^[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}$
Wersja Pythona mogłaby wyglądać następująco:
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})?$/
Wyrażenie regularne powyżej sprawdza poprawność wszystkich poniższych typów adresów MAC:
01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
dla programisty PHP
filter_var($value, FILTER_VALIDATE_MAC)
Nie sądzę, że główne wyrażenie regularne jest poprawne, ponieważ również klasyfikuje
'3D-F2-C9:A6-B3:4F'
jako prawidłowy adres MAC, nawet jeśli nie jest poprawny. Prawidłowy byłby:
((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))
Więc za każdym razem możesz wybrać „:” lub „-” dla całego adresu MAC.
Możesz skorzystać z poniższej procedury, przekazując adres MAC do weryfikacji,
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();
}
Osoby PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Potrzebujesz wyjaśnienia: http://regex101.com/r/wB0eT7
aby dopasować 48-bitowe adresy MAC EUI-48 i 64-bitowe EUI-64:
/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/
gdzie \ h jest znakiem w [0-9a-fA-F]
lub:
/\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/
pozwala to na użycie „-” lub „:” lub bez separatora
Może najkrótszy możliwy:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
Aktualizacja : istnieje lepszy sposób sprawdzania poprawności adresów MAC w PHP, który obsługuje zarówno adresy MAC ze stylem myślnika, jak i dwukropka. Użyj zmiennej filter_var () :
// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);
Jak wiem, obsługuje adresy MAC w tych formach (x: liczba szesnastkowa):
xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
Wielkie dzięki @Moshe za wielką odpowiedzi powyżej. Po przeprowadzeniu dalszych badań chciałbym dodać moje dodatkowe ustalenia, zarówno w odniesieniu do IEEE 802, jak i wymuszania spójnego użycia separatora w wyrażeniach regularnych.
Standardowy format (IEEE 802) do drukowania adresów MAC-48 w postaci przyjaznej dla człowieka to sześć grup po dwie cyfry szesnastkowe oddzielone myślnikami - . Jest jednak powszechnie przyjętą konwencją, która zezwala również na dwukropek: i trzy grupy po cztery cyfry szesnastkowe oddzielone kropkami. .
Pełne uznanie dla @Moshe tutaj za jego wstępne oświadczenie i dla @pilcrow za wskazanie, że IEEE 802 obejmuje tylko hipeny.
Oto wyrażenie regularne, które wymusza użycie tego samego separatora w całym adresie mac:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
A oto dodatkowy, który pozwala w ogóle nie używać separatora:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
Ponieważ adres MAC może mieć 6 lub 20 bajtów (infiniband, ...), poprawna odpowiedź brzmi:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
możesz zamienić: na [: -.]? jeśli chcesz mieć różne separatory lub żadnych.
najlepszą odpowiedzią jest wyrażenie regularne sprawdzania poprawności adresu mac
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$