Apa yang dimaksud dengan ekspresi reguler untuk Alamat MAC?

125

Dalam format ini:

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

atau:

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

Jawaban:

266

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})$
netcoder
sumber
21
Perhatikan bahwa jika mereka disimpan dengan huruf heksadesimal huruf kecil, itu tidak akan cocok mengubah grup menjadi [0-9A-Fa-f] untuk menangkap kedua kasus
Scott Chamberlain
5
Anda mungkin juga ingin mengabaikan casing
dietbuddha
5
^ ([0-9A-Fa-f] {2} [: -]) {5} ([0-9A-Fa-f] {2}) $
Rajavel D
2
Sebagai tambahan, kutipan di atas mengenai "format standar" berasal dari Wikipedia, bukan dari badan standar 802.3. IEEE 802-2014 sebenarnya menentukan tanda hubung untuk alamat MAC biasa (§ 8.1 ¶ 3) dan titik dua untuk notasi bit-reversed usang (¶ 4). Yang penting, dalam praktiknya, tidak ada yang mengamati ini . Kami hanya menggunakan satu atau yang lain, tetapi tidak pernah mencampurnya dalam satu MAC tertulis.
pilcrow
1
Saya tidak berpikir bahwa RegEx ini benar karena juga mengklasifikasikan '3D-F2-C9: A6-B3: 4F' sebagai Alamat MAC yang valid, meskipun 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.
PyFox
23

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

pilcrow
sumber
Ini berfungsi, tetapi dapatkah Anda menjelaskan apa itu: xdigit? dan saya perhatikan Anda menempatkan grup ([-:]) setelah panjangnya, apa yang membuat semua tanda titik dua atau tanda hubung dibuat?
Xaisoft
2
@Xaisoft, :xdigit:kependekan dari hex digit, lebih atau kurang cara lain untuk mengatakan [a-fA-F0-9]. The \1mengacu pada kelompok capture untuk dasbor pertama atau usus besar ([-:]), dan hanya cocok dengan apa yang cocok yang pertama kalinya.
pilcrow
2
+1 untuk menggunakan kedua kelompok menangkap dan tidak menangkap secara tepat, dan juga untuk menggunakan :xdigit:(meskipun "steno" hanya lebih pendek dari [a-fA-F0-9]dan setara /[a-f0-9]/ilebih pendek!)
gb96
@pilcrow bisa tolong jelaskan mengapa mac ini: C8:FD:19:55:E6:3Agagal? Ini alamat mac yang sebenarnya. Saya memodifikasi regex Anda :hanya untuk menerima /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/Terima kasih!
Sam
1
Dalam pikiran saya ini adalah jawaban yang lebih baik karena sebenarnya memeriksa penggunaan campuran ":" dan "-".
Ray Oei
9

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!

Vesselin Yanev
sumber
Ini akan cocok dengan pemisah setelah salah satu dari lima oktet pertama, artinya ia akan menerima aa.aa.bbbb.cccc, misalnya.
pilcrow
1
#notAllFormats Jika Anda memiliki akses ke sistem OSX dengan WiFi, jalankan /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 ( %xatau %2xlebih daripada %02x printfformat yang digunakan?)
nhed
8

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 ...
anak singa
sumber
2
Yang kedua akan mencocokkan string yang berisi karakter non-hex seperti g.
Binary Phile
Yang kedua tidak valid dalam kebanyakan rasa, kecuali untuk BRE / ERE, yang mendukung pengumpulan rentang karakter. Namun, dukungan untuk rentang karakter beragam di antara implementasi, sehingga hasilnya dapat bervariasi.
nhahtdh
Hal lain adalah bahwa grup harus memiliki tepat 2 digit hexa.
nhahtdh
Secara teori, semua alamat mac yang dikembalikan oleh program-program di alam liar akan mengikuti beberapa standar seperti 2 digit hex di setiap grup yang terpisah. Namun, beberapa varian Unix non-standar mempersingkat output ketika ada nol di depan, hanya menyisakan 1 hex hex dalam beberapa kasus. Oleh karena itu perlunya {1,2}regex
TrinitronX
Namun, set karakter dari [0-9a-F]mungkin harus ditulis ulang sebagai:[0-9a-fA-F]
TrinitronX
5

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.

tchrist
sumber
5

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

Manohar Bhattarai
sumber
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}$
JYelton
sumber
1
Apakah tidak ada cara untuk mempersingkat dengan melakukan kelompok? dan bagaimana saya bisa menggabungkan regex untuk memiliki: atau a - tanpa memiliki 2 ekspresi reguler yang terpisah?
Xaisoft
Bentuk singkat yang disediakan netcoder juga akan berfungsi. Menggunakan satu atau yang lain mungkin didasarkan pada apakah Anda perlu menangkap salah satu alamat MAC atau hanya memvalidasinya secara keseluruhan.
JYelton
Ini perlu divalidasi secara keseluruhan, jadi jika itu berisi semua tanda hubung atau semua titik dua. Jika mengandung campuran, itu bukan MAC yang valid.
Xaisoft
2
@ Xaisoft: Seperti yang saya katakan di komentar jawaban saya, mencampur titik dua dan tanda hubung valid sesuai dengan spesifikasi
netcoder
Sumber apa yang Anda dapatkan dari alamat MAC yang mungkin memiliki campuran pembatas? Jika mereka berasal dari mesin / NIC yang sebenarnya, Anda kemungkinan tidak akan mengalami masalah itu. Jika data yang dimasukkan pengguna, cukup lakukan penggantian string untuk membuat semua pembatas konsisten.
JYelton
2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
bcosca
sumber
Apakah ini mirip dengan jawaban pilcrow, hanya tanpa: xdigit?
Xaisoft
2

Versi python bisa berupa:

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

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
Mohammed Réda OUASSINI
sumber
Saya pikir ini adalah satu-satunya yang lengkap dan benar.
Vincent Sels
1

untuk pengembang PHP

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

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.

PyFox
sumber
0

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

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

bn00d
sumber
0

Jika Anda membutuhkan spasi di antara angka, seperti varian ini

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

Regex berubah menjadi

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

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

Tilo
sumber
0

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
MAChitgarha
sumber
0

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

Demo Regex101

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

Demo Regex101

Robert Axelsen
sumber
0

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.

Olivier LAHAYE
sumber
-1

Yang ini kecil:

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

Ingat, campuran aneh beberapa karakter atau pemisah bisa lewat.

esguti
sumber
-4

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])$
Rittika Nagar
sumber