Antworten:
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})$
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.)
:xdigit:
ist die Abkürzung für Hex-Ziffer, mehr oder weniger eine andere Art zu sagen [a-fA-F0-9]
. Das \1
bezieht sich auf die Erfassungsgruppe für den ersten Bindestrich oder Doppelpunkt ([-:])
und stimmt nur mit dem überein, was beim ersten Mal übereinstimmte.
:xdigit:
(obwohl diese "Kurzschrift" nur kürzer als [a-fA-F0-9]
und gleichwertig /[a-f0-9]/i
kürzer ist!)
C8:FD:19:55:E6:3A
ausfä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 !
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!
aa.aa.bbbb.cccc
beispielsweise akzeptiert wird.
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
die BSSID-Zeile aus und suchen Sie sie. Wenn ein Oktett unter 0x10 liegt, wird die führende Null gelöscht ( %x
oder %2x
nicht das verwendete %02x
printf
Format?)
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 ...
{1,2}
regulären Ausdruck
[0-9a-F]
sollte jedoch wahrscheinlich wie folgt umgeschrieben werden:[0-9a-fA-F]
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.
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})
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}$
Die Python-Version könnte sein:
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})?$/
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
für PHP-Entwickler
filter_var($value, FILTER_VALIDATE_MAC)
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.
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();
}
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
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
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
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}))$
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}))$
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.
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])$