Was ist ein regulärer Ausdruck für eine MAC-Adresse?

125

In diesem Format:

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

oder:

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

Antworten:

266

Das Standardformat (IEEE 802) zum Drucken von MAC-48-Adressen in benutzerfreundlicher Form besteht aus sechs Gruppen mit zwei hexadezimalen Ziffern, die durch Bindestriche -oder Doppelpunkte getrennt sind :.

So:

^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Netcoder
quelle
21
Beachten Sie, dass wenn sie mit hexadezimalen Kleinbuchstaben gespeichert werden, die Gruppe nicht mit [0-9A-Fa-f] übereinstimmt, um beide Fälle zu erfassen
Scott Chamberlain,
5
Sie möchten wahrscheinlich auch Gehäuse
Dietbuddha
5
^ ([0-9A-Fa-f] {2} [: -]) {5} ([0-9A-Fa-f] {2}) $
Rajavel D
2
Abgesehen davon stammt das obige Zitat zum "Standardformat" von Wikipedia, nicht vom 802.3-Standardkörper. IEEE 802-2014 spezifiziert tatsächlich Bindestriche für normale MAC-Adressen (§ 8.1 ¶ 3) und Doppelpunkte für die veraltete bitumgekehrte Notation (¶ 4). Wichtig ist, dass dies in der Praxis niemand beobachtet . Wir verwenden einfach das eine oder andere, mischen sie jedoch niemals in einem einzigen geschriebenen MAC.
Pilcrow
1
Ich denke nicht, dass dieses RegEx korrekt ist, da es auch '3D-F2-C9: A6-B3: 4F' als gültige MAC-Adresse klassifiziert, obwohl es nicht korrekt ist. Die richtige wäre: ((([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | (([a- zA-z0-9] {2} :) {5} ([a-zA-z0-9] {2}))) Damit Sie jedes Mal ':' oder '-' für die gesamte MAC-Adresse wählen können.
PyFox
23

Ein bisschen hart für die Augen, aber das:

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

Erzwingt entweder alle Doppelpunkte oder alle Bindestriche für Ihre MAC-Notation.

(Ein einfacherer Regex-Ansatz könnte beispielsweise zulassen A1:B2-C3:D4-E5:F6, was der oben genannte ablehnt.)

Pilger
quelle
Das funktioniert, aber können Sie erklären, was: xdigit ist? und mir ist aufgefallen, dass Sie die Gruppe ([-:]) nach der Länge setzen. Warum nimmt das entweder alle Doppelpunkte oder Bindestriche?
Xaisoft
2
@Xaisoft :xdigit:ist die Abkürzung für Hex-Ziffer, mehr oder weniger eine andere Art zu sagen [a-fA-F0-9]. Das \1bezieht sich auf die Erfassungsgruppe für den ersten Bindestrich oder Doppelpunkt ([-:])und stimmt nur mit dem überein, was beim ersten Mal übereinstimmte.
Pilcrow
2
+1 für die angemessene Verwendung von Erfassungs- und Nichterfassungsgruppen sowie für die Verwendung :xdigit:(obwohl diese "Kurzschrift" nur kürzer als [a-fA-F0-9]und gleichwertig /[a-f0-9]/ikürzer ist!)
gb96
@pilcrow Könnten Sie bitte erklären, warum dieser Mac: C8:FD:19:55:E6:3Aausfällt? Es ist eine tatsächliche Mac-Adresse. Ich habe Ihre Regex so geändert, dass :nur /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/Danke akzeptiert wird !
Sam
1
In meinen Augen ist dies die bessere Antwort, da sie tatsächlich die gemischte Verwendung von ":" und "-" überprüft.
Ray Oei
9

Dieser reguläre Ausdruck passt zu nahezu jedem Mac-Format, einschließlich des Cisco-Formats wie 0102-0304-abcd

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

Beispielzeichenfolgen, mit denen es übereinstimmt:

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

Das gemischte Format wird ebenfalls angepasst!

Vesselin Yanev
quelle
Dies stimmt mit Trennzeichen nach einem der ersten fünf Oktette überein, was bedeutet, dass es aa.aa.bbbb.ccccbeispielsweise akzeptiert wird.
Pilcrow
1
#notAllFormats Wenn Sie Zugriff auf ein OSX-System mit WiFi haben, führen Sie /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Idie BSSID-Zeile aus und suchen Sie sie. Wenn ein Oktett unter 0x10 liegt, wird die führende Null gelöscht ( %xoder %2xnicht das verwendete %02x printfFormat?)
Uhr
8

Trennzeichen: " : ", " - ", " . "

doppelt oder einfach: 00 = 0, 0f = f

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

oder

/^([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 ...
Lioncub
quelle
2
Die zweite Option stimmt nicht mit Zeichenfolgen überein, die nicht hexadezimale Zeichen wie g enthalten.
Binary Phile
Die zweite ist in den meisten Geschmacksrichtungen nicht gültig, mit Ausnahme von BRE / ERE, das die Sortierung von Zeichenbereichen unterstützt. Die Unterstützung für die Sortierung von Zeichenbereichen variiert jedoch je nach Implementierung, sodass das Ergebnis variieren kann.
nhahtdh
Eine andere Sache ist, dass die Gruppen genau 2 Hexa-Ziffern haben müssen.
nhahtdh
Theoretisch würden alle Mac-Adressen, die von Programmen in freier Wildbahn zurückgegeben werden, einem Standard wie 2 Hex-Ziffern in jeder einzelnen Gruppe folgen. Einige nicht standardisierte Unix-Varianten verkürzen jedoch die Ausgabe, wenn eine führende Null vorliegt, und lassen in einigen Fällen nur 1 Hex-Zeichen übrig. Daher die Notwendigkeit für den {1,2}regulären Ausdruck
TrinitronX
Der Zeichensatz von [0-9a-F]sollte jedoch wahrscheinlich wie folgt umgeschrieben werden:[0-9a-fA-F]
TrinitronX
5

Seien Sie gewarnt, dass die Unicode-Eigenschaft \p{xdigit}die FULLWIDTH-Versionen enthält. Vielleicht bevorzugen Sie \p{ASCII_Hex_Digit}stattdessen.

Die Antwort auf die gestellte Frage kann am besten beantwortet werden - vorausgesetzt, Sie haben ein bestimmtes ehrwürdiges CPAN-Modul installiert -, indem Sie Folgendes eingeben:

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

Ich zeige das spezielle Muster, das hier ausgegeben wird als Glücksmuster Nummer 13; es gibt viele andere.

Dieses Programm:

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

generiert diese Ausgabe:

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

Welches scheint die Art von Dingen, die Sie suchen.

tchrist
quelle
5

Dieser Link könnte Ihnen helfen. Sie können dies verwenden:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})

Manohar Bhattarai
quelle
4

Siehe diese Frage .

Regexes wie folgt:

^[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}$
JYelton
quelle
1
Gibt es nicht eine Möglichkeit, es durch Gruppen zu verkürzen? und wie kann ich den regulären Ausdruck kombinieren, um entweder ein: oder ein - zu haben, ohne zwei separate reguläre Ausdrücke zu haben?
Xaisoft
Die verkürzte Form, die der Netzcodierer bereitstellt, funktioniert auch. Die Verwendung der einen oder anderen kann davon abhängen, ob Sie eine der MAC-Adressen erfassen oder nur insgesamt validieren müssen.
JYelton
Es muss insgesamt validiert werden, wenn es also entweder alle Bindestriche oder alle Doppelpunkte enthält. Wenn es eine Mischung enthält, ist es kein gültiger MAC.
Xaisoft
2
@Xaisoft: Wie ich im Kommentar meiner Antwort sagte, ist das Mischen von Doppelpunkten und Bindestrichen gemäß der Spezifikation gültig.
Netcoder
Aus welcher Quelle beziehen Sie MAC-Adressen, die möglicherweise eine Mischung aus Trennzeichen enthalten? Wenn sie von einer tatsächlichen Maschine / Netzwerkkarte stammen, tritt dieses Problem wahrscheinlich nicht auf. Wenn es sich um vom Benutzer eingegebene Daten handelt, führen Sie einfach eine Zeichenfolgenersetzung durch, um alle Trennzeichen konsistent zu machen.
JYelton
2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
bcosca
quelle
Ist das ähnlich wie die Antwort von Pilcrow, nur ohne: xdigit?
Xaisoft
2

Die Python-Version könnte sein:

re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
Juan Diego Godoy Robles
quelle
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})?$/

Der obige reguläre Ausdruck überprüft alle unten aufgeführten Mac-Adresstypen:

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
Mohammed Réda OUASSINI
quelle
Ich denke, dies ist die einzige, die vollständig und korrekt ist.
Vincent Sels
1

für PHP-Entwickler

filter_var($value, FILTER_VALIDATE_MAC)
Saurabh Chandra Patel
quelle
1

Ich denke nicht, dass das Haupt-RegEx korrekt ist, da es auch klassifiziert

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

als gültige MAC-Adresse, obwohl sie nicht korrekt ist. Das Richtige wäre:

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

Damit können Sie jedes Mal ':' oder '-' für die gesamte MAC-Adresse wählen.

PyFox
quelle
0

Sie können das folgende Verfahren verwenden, indem Sie die Mac-Adresse zur Validierung übergeben:

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();             
}
Hari Babu Mandala
quelle
0

PHP-Leute:

print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));

Benötigen Sie eine Erklärung: http://regex101.com/r/wB0eT7

bn00d
quelle
0

Wenn Sie Leerzeichen zwischen Zahlen benötigen, wie bei dieser Variante

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

Die Regex ändert sich zu

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

um sowohl 48-Bit-EUI-48- als auch 64-Bit-EUI-64-MAC-Adressen abzugleichen:

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

wobei \ h ein Zeichen in [0-9a-fA-F] ist

oder:

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

Dadurch kann '-' oder ':' oder kein Trennzeichen verwendet werden

Tilo
quelle
0

Vielleicht so schnell wie möglich:

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

Update : Es gibt eine bessere Möglichkeit, MAC-Adressen in PHP zu validieren, die sowohl MAC-Adressen im Bindestrich- als auch im Doppelpunktstil unterstützt. Verwenden Sie filter_var () :

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

Wie ich weiß, werden MAC-Adressen in folgenden Formen unterstützt (x: eine Hexadezimalzahl):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
MAChitgarha
quelle
0

Vielen Dank an @Moshe für die großartige Antwort oben. Nach weiteren Recherchen möchte ich meine zusätzlichen Erkenntnisse hinzufügen, sowohl in Bezug auf IEEE 802 als auch in Bezug auf die Durchsetzung einer konsistenten Verwendung von Trennzeichen in Regex.

Das Standardformat (IEEE 802) zum Drucken von MAC-48-Adressen in benutzerfreundlicher Form besteht aus sechs Gruppen mit zwei hexadezimalen Ziffern, die durch Bindestriche getrennt sind . Es ist jedoch eine weit verbreitete Konvention, auch Doppelpunkt: und drei Gruppen von vier hexadezimalen Ziffern zuzulassen , die durch Punkte getrennt sind . .

Volle Anerkennung an @Moshe hier für seine erste Aussage und an @pilcrow für den Hinweis, dass IEEE 802 nur Hypens abdeckt.

Hier ist ein regulärer Ausdruck, der erzwingt, dass in der gesamten Mac-Adresse dasselbe Trennzeichen verwendet wird:

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

Regex101-Demo

Und hier ist eine zusätzliche, bei der überhaupt kein Trennzeichen verwendet werden kann:

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

Regex101-Demo

Robert Axelsen
quelle
0

Da eine MAC-Adresse 6 oder 20 Bytes (Infiniband, ...) sein kann, lautet die richtige Antwort:

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

Sie können ersetzen: durch [: -.]? wenn Sie verschiedene oder keine Trennzeichen möchten.

Olivier LAHAYE
quelle
-1

Dieser ist klein:

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

Denken Sie daran, dass eine seltsame Mischung aus mehreren Zeichen oder Trennzeichen passieren könnte.

esguti
quelle
-4

Die beste Antwort ist für Regex zur Überprüfung der Mac-Adresse

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
Rittika Nagar
quelle