Co to jest wyrażenie regularne dla adresu MAC?


125

W tym formacie:

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

lub:

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

Odpowiedzi:


266

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

21
Zauważ, że jeśli są przechowywane z małymi literami szesnastkowymi, nie będzie pasować, zmień grupę na [0-9A-Fa-f], aby złapać oba przypadki
Scott Chamberlain

5
prawdopodobnie chcesz też zignorować
okrywanie

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

2
Nawiasem mówiąc, powyższy cytat dotyczący „standardowego formatu” pochodzi z Wikipedii, a nie organizacji zajmującej się standardami 802.3. IEEE 802-2014 w rzeczywistości określa łączniki dla zwykłych adresów MAC (§ 8.1 ¶ 3) i dwukropki dla przestarzałej notacji odwróconej bitowo (¶ 4). Co ważne, w praktyce nikt tego nie zauważa . Po prostu używamy jednego lub drugiego, ale nigdy nie mieszamy ich w jednym zapisanym MAC.
pilcrow 14.07.15

1
Nie sądzę, że to wyrażenie RegEx jest poprawne, ponieważ klasyfikuje również „3D-F2-C9: A6-B3: 4F” jako prawidłowy adres MAC, nawet jeśli nie jest poprawny. Poprawna to: ((([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.
PyFox,

23

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


To działa, ale czy możesz wyjaśnić, co to jest: xdigit to? i zauważyłem, że wstawiasz grupę ([-:]) po długości, co sprawia, że ​​są to wszystkie dwukropki lub łączniki?
Xaisoft

2
@Xaisoft, :xdigit:to skrót od cyfry szesnastkowej, mniej więcej inaczej mówiąc [a-fA-F0-9]. \1Odnosi się do grupy przechwytującej pierwszej desce rozdzielczej lub okrężnicy ([-:]), i tylko pasuje co dopasowane, że po raz pierwszy.
pilcrow

2
+1 za właściwe używanie zarówno grup przechwytujących, jak i nie do przechwytywania, a także za używanie :xdigit:(chociaż to „skrót” jest tylko krótsze, [a-fA-F0-9]a odpowiednik /[a-f0-9]/ikrótszy!)
gb96

@pilcrow czy mógłbyś wyjaśnić, dlaczego ten mac: C8:FD:19:55:E6:3Anie 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!
Sam

1
Moim zdaniem jest to lepsza odpowiedź, ponieważ faktycznie sprawdza mieszane użycie znaków „:” i „-”.
Ray Oei

9

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!


Spowoduje to dopasowanie separatorów po dowolnym z pierwszych pięciu oktetów, co oznacza, że aa.aa.bbbb.ccccna przykład zaakceptuje .
pilcrow

1
#notAllFormats Jeśli masz dostęp do systemu OSX z Wi-Fi, uruchom /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Ii poszukaj linii BSSID, jeśli którykolwiek oktet ma mniej niż 0x10 wiodącego zera jest usuwany ( %xlub %2xraczej niż %02x printfużywany format?)
nhed

8

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

2
Drugi nieprawidłowo dopasuje ciągi zawierające znaki inne niż szesnastkowe, takie jak g.
Plik binarny

Drugi nie jest ważny w większości smaków, z wyjątkiem BRE / ERE, który obsługuje sortowanie zakresu znaków. Jednak obsługa sortowania zakresu znaków różni się w zależności od implementacji, więc wynik może się różnić.
nhahtdh

Inną rzeczą jest to, że grupy muszą mieć dokładnie 2 cyfry szesnastkowe.
nhahtdh

Teoretycznie wszystkie adresy MAC zwracane przez programy w środowisku naturalnym byłyby zgodne z pewnymi standardami, takimi jak 2 cyfry szesnastkowe w każdej oddzielnej grupie. Jednak niektóre niestandaryzowane warianty Uniksa skracają wynik, gdy występuje zero wiodące, pozostawiając w niektórych przypadkach tylko 1 znak szesnastkowy. Stąd potrzeba {1,2}wyrażenia regularnego
TrinitronX

Jednak zestaw znaków z [0-9a-F]powinien prawdopodobnie zostać przepisany jako:[0-9a-fA-F]
TrinitronX

5

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.



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

1
Czy nie ma sposobu, aby to skrócić, tworząc grupy? i jak mogę połączyć wyrażenie regularne, aby uzyskać a: lub a - bez dwóch oddzielnych wyrażeń regularnych?
Xaisoft

Skrócona forma dostarczona przez netcoder również będzie działać. Korzystanie z jednego lub drugiego może zależeć od tego, czy musisz przechwycić którykolwiek z adresów MAC, czy po prostu zweryfikować go w całości.
JYelton

Musi zostać zweryfikowany w całości, więc jeśli zawiera wszystkie łączniki lub wszystkie dwukropki. Jeśli zawiera mieszankę, nie jest to prawidłowy adres MAC.
Xaisoft

2
@Xaisoft: Jak powiedziałem w komentarzu do mojej odpowiedzi, mieszanie dwukropków i łączników jest zgodne ze specyfikacją.
netcoder

Z jakiego źródła otrzymujesz adresy MAC, które mogą mieć kombinację ograniczników? Jeśli pochodzą z rzeczywistej maszyny / karty sieciowej, prawdopodobnie nie będziesz mieć tego problemu. Jeśli są to dane wprowadzone przez użytkownika, po prostu wykonaj zamianę ciągu, aby wszystkie separatory były spójne.
JYelton

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

Czy jest to podobne do odpowiedzi Pilcrowa, tylko bez: 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})?$/

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

Myślę, że jest to jedyny kompletny i poprawny.
Vincent Sels


1

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.


0

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


0

Jeśli potrzebujesz spacji między liczbami, jak ten wariant

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

Wyrażenie regularne zmieni się na

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

0

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


0

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

0

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

Demo Regex101

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

Demo Regex101


0

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.


-1

Ten jest mały:

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

Pamiętaj, że może przejść dziwna mieszanka kilku znaków lub separatorów.


-4

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])$
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.