2010-11-23 17 views

Antwort

205

der Standard (IEEE 802) Format für Druck MAC-48-Adressen in menschenfreundliche Form sechs Gruppen von zwei Hexadezimalziffern, getrennt durch Bindestriche - oder Doppelpunkte :. So

:

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

Ok, das ist, was ich gesucht habe, aber ich hatte:^([0-9A-F] {2}: | -) {5} ([0-9A-F] {2}) $ – Xaisoft

+0

Ich dachte nach das: | - würde entweder passen und: oder a -. – Xaisoft

+0

@netcoder +1 gut sagte –

2

Siehe auch this question.

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

gibt es nicht eine zu Möglichkeit, es durch Gruppen zu verkürzen? und wie kann ich die Regex kombinieren, um entweder a: oder a - ohne 2 separate reguläre Ausdrücke zu haben? – Xaisoft

+0

Die verkürzte Form, die Netcoder bietet, wird auch funktionieren. Die Verwendung der einen oder der anderen hängt möglicherweise davon ab, ob Sie eine der MAC-Adressen erfassen oder sie nur als Ganzes validieren müssen. – JYelton

+0

Es muss insgesamt validiert werden, wenn es also entweder alle Bindestriche oder alle Doppelpunkte enthält. Wenn es eine Mischung enthält, ist es keine gültige MAC. – Xaisoft

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

Ist dies der Antwort von pilcrow ähnlich, nur ohne: xdigit? – Xaisoft

16

Ein wenig schwer auf den Augen, aber dies:

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

erzwingt entweder alle Doppelpunkte oder alle Striche für Ihre MAC-Notation.

(Ein einfacherer regex Ansatz könnte A1:B2-C3:D4-E5:F6 erlauben, zum Beispiel, die der oben genannte Ausschuß.)

+0

Das funktioniert, aber können Sie erklären, was: xdigit ist? und ich habe bemerkt, dass du die Gruppe ([-:]) nach der Länge setzt, was macht das entweder alle Doppelpunkte oder Bindestriche? – Xaisoft

+1

@Xaisoft, ': xdigit:' ist die Abkürzung für die hexadezimale Zahl, mehr oder weniger eine andere Art zu sagen '[a-fA-F0-9]'. Das '\ 1' verweist auf die Erfassungsgruppe für den ersten Bindestrich oder den Doppelpunkt' ([-:]) 'und stimmt nur mit dem überein, was dem ersten Mal entspricht. – pilcrow

+0

+1 für die Verwendung sowohl Capturen und nicht-einfangenden Gruppen geeignet, und auch für die Verwendung von '': xdigit: '' '(obwohl diese" Kurzschrift "ist nur kurz kürzer als' '' [a-fA-F0-9 ] '' 'und äquivalent' ''/[a-f0-9]/i''' ist kürzer!) – gb96

3

Wäre Sie gewarnt, dass die Unicode-Eigenschaft \p{xdigit} mit den breiten Versionen enthält. Vielleicht bevorzugen Sie stattdessen \p{ASCII_Hex_Digit}.

Die Antwort auf die gestellte Frage könnte am besten beantwortet werden - vorausgesetzt, Sie haben einen gewissen ehrwürdigen CPAN-Modul installiert - durch Eingabe von:

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

ich zeigen, das bestimmte Muster gibt sie here so viel Glück Musternummer 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 

erzeugt 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 

, die die Art der Sache, die Sie suchen scheint.

4

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

+0

Vielen Dank. Das funktioniert für mich. – HeisenBerg

-4

die beste Antwort ist für MAC-Adresse Validierung regex

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

sehr hilfreich ... –

+2

Ich glaube nicht :-( – Toto

6

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

Doppel- oder Einzel: 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 ... 
+2

Die zweite wird fälschlicherweise Zeichenfolgen entsprechen, die Nicht-Hex-Zeichen wie g enthalten. –

+0

Die zweite ist nicht gültig in den meisten Aromen, außer BRE/ERE, Die Unterstützung für die Sortierung von Zeichenbereichen variiert je nach Implementierung, daher kann das Ergebnis variieren – nhahtdh

+0

Eine andere Sache ist, dass die Gruppen genau 2 Hexa-Ziffern haben müssen – nhahtdh

6

Diese Regex passt so ziemlich jedes Mac-Format, einschließlich Cisco Format wie 0102-0304-abcd

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

Beispiel Strings, die es passt:

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

Mixed-Format wird auch abgestimmt werden!

+0

Dies entspricht den Trennzeichen nach einem der ersten fünf Oktette, was bedeutet, dass es zum Beispiel 'aa.aa.bbbb.cccc' akzeptiert. – pilcrow

+0

** # notAllFormats ** Wenn Sie Zugriff auf ein OSX-System mit WiFi haben, führen Sie '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I' aus und suchen Sie nach der BSSID-Zeile if jedes Oktett ist unter 0x10 führende Null wird fallengelassen ('% x' oder'% 2x' anstelle von '% 02x'' printf' Format verwendet?) – nhed

0

Sie können Verfahren folgende durch die Validierung für MAC-Adresse vorbei,

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

Die Python-Version könnte sein:

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

Die Regex oben bestätigen alle die MAC-Adressen-Typen unter:

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

Wenn Sie Leerzeichen zwischen den Zahlen müssen, wie diese Variante

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

Die Regex ändert zu

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

passend zu 48-Bit-EUI-48 und 64-Bit-EUI-64-MAC Adressen:

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

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

oder ist:

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

dies erlaubt '-' oder ':' oder kein Trenn

verwendet
0

für PHP-Entwickler

filter_var($value, FILTER_VALIDATE_MAC)