Jawaban:
Format standar (IEEE 802) untuk mencetak alamat MAC-48 dalam bentuk yang ramah-manusia adalah enam kelompok dua digit heksadesimal, dipisahkan oleh tanda hubung
-
atau titik dua:
.
Begitu:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Sedikit keras di mata, tapi ini:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
akan memberlakukan semua titik dua atau semua tanda hubung untuk notasi MAC Anda.
(Pendekatan regex yang lebih sederhana mungkin mengizinkan A1:B2-C3:D4-E5:F6
, misalnya, yang ditolak di atas.)
:xdigit:
kependekan dari hex digit, lebih atau kurang cara lain untuk mengatakan [a-fA-F0-9]
. The \1
mengacu pada kelompok capture untuk dasbor pertama atau usus besar ([-:])
, dan hanya cocok dengan apa yang cocok yang pertama kalinya.
:xdigit:
(meskipun "steno" hanya lebih pendek dari [a-fA-F0-9]
dan setara /[a-f0-9]/i
lebih pendek!)
C8:FD:19:55:E6:3A
gagal? Ini alamat mac yang sebenarnya. Saya memodifikasi regex Anda :
hanya untuk menerima /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
Terima kasih!
Regex ini cocok dengan hampir semua format mac termasuk format Cisco seperti 0102-0304-abcd
^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$
Contoh string yang cocok:
01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd
Format campuran akan dicocokkan juga!
aa.aa.bbbb.cccc
, misalnya.
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
, dan cari jalur BSSID, jika oktet apa pun di bawah 0x10 nol di awal dijatuhkan ( %x
atau %2x
lebih daripada %02x
printf
format yang digunakan?)
pembatas: " : ", " - ", " . "
ganda atau tunggal: 00 = 0, 0f = f
/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i
atau
/^([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}
regex
[0-9a-F]
mungkin harus ditulis ulang sebagai:[0-9a-fA-F]
Berhati-hatilah karena properti Unicode \p{xdigit}
menyertakan versi FULLWIDTH. Anda mungkin lebih suka \p{ASCII_Hex_Digit}
.
Jawaban untuk pertanyaan yang diajukan mungkin paling baik dijawab - asalkan Anda memiliki modul CPAN terhormat tertentu diinstal - dengan mengetik:
% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
Saya menunjukkan pola tertentu yang dihasilkannya di sini sebagai pola keberuntungan nomor 13; ada banyak lainnya.
Program ini:
#!/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
menghasilkan output ini:
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
Yang sepertinya adalah hal yang Anda cari.
Tautan ini mungkin membantu Anda. Anda bisa menggunakan ini:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})
Lihat pertanyaan ini juga.
Regex sebagai berikut:
^[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}$
Versi python bisa berupa:
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})?$/
Regex di atas memvalidasi semua jenis alamat mac di bawah:
01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
untuk pengembang PHP
filter_var($value, FILTER_VALIDATE_MAC)
Saya tidak berpikir bahwa RegEx utama sudah benar karena juga mengklasifikasikan
'3D-F2-C9:A6-B3:4F'
sebagai Alamat MAC yang valid, meskipun itu tidak benar. Yang benar adalah:
((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))
Sehingga setiap kali Anda dapat memilih ':' atau '-' untuk seluruh alamat MAC.
Anda dapat menggunakan prosedur berikut dengan mengirimkan alamat mac untuk validasi,
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();
}
Orang PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Perlu Penjelasan: http://regex101.com/r/wB0eT7
untuk mencocokkan alamat MAC EUI-48 48-bit dan 64-bit EUI-64:
/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/
di mana \ h adalah karakter dalam [0-9a-fA-F]
atau:
/\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/
ini memungkinkan '-' atau ':' atau tidak ada pemisah yang digunakan
Mungkin yang sesingkat mungkin:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
Pembaruan : Ada cara yang lebih baik untuk memvalidasi alamat MAC dalam PHP yang mendukung untuk alamat MAC gaya tanda hubung dan gaya tanda titik dua. Gunakan filter_var () :
// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);
Seperti yang saya tahu, ini mendukung alamat MAC dalam bentuk ini (x: angka heksadesimal):
xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
Terima kasih banyak kepada @Moshe untuk jawaban hebat di atas. Setelah melakukan penelitian lebih lanjut saya ingin menambahkan temuan tambahan saya, baik dalam hal IEEE 802 dan menegakkan penggunaan pemisah yang konsisten di regex.
Format standar (IEEE 802) untuk mencetak alamat MAC-48 dalam bentuk ramah-manusia adalah enam kelompok dua digit heksadesimal, dipisahkan oleh tanda hubung - . Namun demikian, konvensi yang diadopsi secara luas untuk juga mengizinkan usus besar:, dan tiga kelompok empat digit heksadesimal dipisahkan oleh periode. .
Kredit penuh untuk @ Moshe di sini untuk pernyataan awalnya, dan @pilcrow karena menunjukkan bahwa IEEE 802 hanya mencakup hipens.
Berikut adalah regex yang memberlakukan pemisah yang sama digunakan di seluruh alamat mac:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
Dan berikut ini adalah tambahan yang memungkinkan untuk tidak menggunakan pemisah sama sekali:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
Karena alamat MAC bisa 6 atau 20 byte (infiniband, ...) jawaban yang benar adalah:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
Anda dapat mengganti: dengan [: -.]? jika Anda ingin pemisah yang berbeda atau tidak ada.
jawaban terbaik adalah untuk regex validasi alamat mac
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$