Bir MAC Adresi için normal ifade nedir?


125

Bu formatta:

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

veya:

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

Yanıtlar:


267

MAC-48 adreslerini insan dostu biçimde yazdırmak için standart (IEEE 802) biçimi, tire -veya iki nokta üst üste ile ayrılmış iki onaltılık basamaktan oluşan altı gruptur :.

Yani:

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

21
Küçük harf onaltılık harflerle saklanıyorlarsa, her iki durumu da yakalamak için grubu [0-9A-Fa-f] olarak değiştirin
Scott Chamberlain

5
muhtemelen kasayı da görmezden gelmek istiyorsunuz
dietbuddha

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

2
Bir kenara, yukarıdaki "standart format" ile ilgili alıntı, 802.3 standartları gövdesinden değil Wikipedia'dan gelmektedir. IEEE 802-2014, aslında sıradan MAC adresleri için kısa çizgiler (§ 8.1 hy 3) ve eskimiş bit ters gösterimi (¶ 4) için iki nokta üst üste belirtir . Önemlisi, pratikte kimse bunu gözlemlemiyor . Sadece birini veya diğerini kullanırız, ancak bunları asla tek bir yazılı MAC'de karıştırmayız.
pilcrow

1
Doğru olmasa da '3D-F2-C9: A6-B3: 4F'yi geçerli bir MAC Adresi olarak sınıflandırdığı için bu RegEx'in doğru olduğunu düşünmüyorum. Doğru olan: (([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | (([a- zA-z0-9] {2}:) {5} ([a-zA-z0-9] {2}))) Böylece her seferinde tüm MAC adresi için ':' veya '-' seçebilirsiniz.
PyFox

23

Gözler için biraz sert, ama bu:

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

MAC gösteriminiz için tüm iki nokta üst üste veya tüm kısa çizgiler uygulayacaktır.

(Daha basit bir normal ifade yaklaşımı A1:B2-C3:D4-E5:F6, örneğin, yukarıdakilerin reddetmesine izin verebilir .)


Bu çalışır, ancak xdigit'in ne olduğunu açıklayabilir misiniz? ve ([-:]) grubunu uzunluktan sonra koyduğunuzu fark ettim, bunun tüm iki nokta üst üste veya kısa çizgileri almasını sağlayan nedir?
Xaisoft

2
@ Xaisoft, :xdigit:onaltılık rakamın kısaltmasıdır, aşağı yukarı başka bir deyişle [a-fA-F0-9]. \1İlk çizgi veya kolon için yakalama grubunu ifade etmektedir ([-:])ve sadece ilk kez eşleşti eşleşir.
pilcrow

2
Hem yakalayan hem de yakalamayan grupları uygun şekilde kullanmak ve ayrıca kullanmak için +1 :xdigit:(bu "steno" sadece daha kısa [a-fA-F0-9]ve eşdeğeri /[a-f0-9]/idaha kısa olsa bile !)
gb96

@pilcrow, bu mac'in neden C8:FD:19:55:E6:3Abaşarısız olduğunu açıklar mısınız? Bu gerçek bir Mac adresi. Normal ifadenizi :yalnızca /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/Teşekkürler kabul edecek şekilde değiştirdim !
Sam

1
Bence bu daha iyi cevap çünkü ":" ve "-" nin karışık kullanımını kontrol ediyor.
Ray Oei

9

Bu normal ifade, Cisco formatı dahil hemen hemen her mac formatıyla eşleşir. 0102-0304-abcd

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

Eşleştiği örnek dizeler:

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

Karışık format da eşleşecek!


Bu, aa.aa.bbbb.ccccörneğin , kabul edeceği anlamına gelen ilk beş sekizliden herhangi birinden sonraki ayırıcılarla eşleşecektir .
pilcrow

1
#notAllFormats WiFi'li bir OSX sistemine erişiminiz varsa, çalıştırın /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Ive BSSID satırını arayın, herhangi bir sekizli %x%2x%02x printf
0x10'un altındaysa, baştaki

8

sınırlayıcı: " : ", " - ", " . "

çift ​​veya tek: 00 = 0, 0f = f

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

veya

/^([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
İkincisi, g gibi onaltılık olmayan karakterler içeren dizelerle hatalı şekilde eşleşecektir.
Binary Phile

İkincisi, karakter aralığı harmanlamasını destekleyen BRE / ERE haricinde çoğu tatta geçerli değildir. Bununla birlikte, karakter aralığı harmanlama desteği, uygulamaya göre değişir, bu nedenle sonuç değişebilir.
nhahtdh

Başka bir şey de, grupların tam olarak 2 altı haneli olması gerektiğidir.
nhahtdh

Teoride, vahşi ortamdaki programlar tarafından döndürülen tüm mac adresleri, her ayrı grupta 2 onaltılık basamak gibi bazı standartları takip eder. Bununla birlikte, bazı standartlaştırılmamış Unix varyantları , başında sıfır olduğunda çıktıyı kısaltır ve bazı durumlarda yalnızca 1 onaltılık karakter bırakır. Bu nedenle {1,2}normal
ifadeye

Bununla birlikte, karakter kümesinin [0-9a-F]muhtemelen şu şekilde yeniden yazılması gerekir:[0-9a-fA-F]
TrinitronX

5

Unicode özelliğinin \p{xdigit}FULLWIDTH sürümlerini içerdiğine dikkat edin. Bunun \p{ASCII_Hex_Digit}yerine tercih edebilirsiniz .

Sorulan sorunun cevabı - belirli bir saygıdeğer CPAN modülünün kurulu olması koşuluyla - aşağıdakileri yazarak en iyi şekilde cevaplanabilir:

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

Burada çıkardığı belirli modeli şanslı desen numarası 13 olarak gösteriyorum; daha birçokları var.

Bu program:

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

bu çıktıyı üretir:

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

Bu da aradığınız türden bir şey gibi görünüyor.



4

Bu soruya da bakın .

Normal ifadeler aşağıdaki gibidir:

^[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
Gruplar yaparak bunu kısaltmanın bir yolu yok mu? ve normal ifadeyi 2 ayrı normal ifade olmadan a: veya a olacak şekilde nasıl birleştirebilirim?
Xaisoft

Netcoder'ın sağladığı kısaltılmış biçim de çalışacaktır. Birini veya diğerini kullanmak, MAC adreslerinden herhangi birini yakalamanıza veya sadece bütünüyle doğrulamanıza bağlı olabilir.
JYelton

Tüm tireleri veya tüm iki nokta üst üste işaretlerini içeriyorsa, bir bütün olarak doğrulanması gerekir. Bir karışım içeriyorsa, geçerli bir MAC değildir.
Xaisoft

2
@Xaisoft: Cevabımın yorumunda da söylediğim gibi, iki nokta üst üste ve kısa çizgilerin karıştırılması şartnameye göre geçerlidir.
netcoder

Sınırlayıcıların karışımına sahip olabilecek MAC adreslerini hangi kaynaktan alıyorsunuz? Gerçek bir makineden / NIC'den geliyorlarsa, muhtemelen bu sorunu yaşamayacaksınız. Kullanıcı tarafından girilen verilerse, tüm sınırlayıcıları tutarlı hale getirmek için bir dizi değiştirme işlemi gerçekleştirin.
JYelton

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

Bu, xdigit olmadan pilcrow'un cevabına benziyor mu?
Xaisoft


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

Yukarıdaki normal ifade, aşağıdaki tüm Mac adresi türlerini doğrular:

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

Bence tam ve doğru olan tek şey bu.
Vincent Sels


1

Teşekkür için çok @Moshe için büyük bir cevap yukarıda. Biraz daha araştırma yaptıktan sonra, hem IEEE 802 ile ilgili hem de regex'te tutarlı ayırıcı kullanımını zorunlu kılan fazladan bulgularımı eklemek istiyorum.

MAC-48 adreslerini insan dostu biçimde yazdırmak için standart (IEEE 802) biçimi, kısa çizgilerle ayrılmış iki onaltılık basamaktan oluşan altı gruptur - . Bununla birlikte, iki nokta üst üste: ve noktalarla ayrılmış dört onaltılık basamaktan oluşan üç gruba da izin vermek için yaygın olarak benimsenen bir kuraldır. .

İlk ifadesi için burada @Moshe'ye ve IEEE 802'nin yalnızca hipenleri kapsadığına işaret ettiği için @pilcrow'a tam kredi .

Mac adresi boyunca aynı ayırıcının kullanılmasını zorunlu kılan bir normal ifade:

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

Regex101 demosu

Ve burada hiçbir ayırıcı kullanılmasına izin vermeyen bir tane daha var:

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

Regex101 demosu


1

Ana Normal İfadenin de sınıflandırdığı için doğru olduğunu düşünmüyorum

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

doğru olmasa bile geçerli bir MAC Adresi olarak. Doğru olan şudur:

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

Böylece her seferinde tüm MAC adresi için ':' veya '-' seçebilirsiniz.


0

Doğrulama için mac adresini geçerek aşağıdaki prosedürü kullanabilirsiniz,

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


0

Bu varyant gibi sayılar arasında boşluklara ihtiyacınız varsa

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

Normal ifade şu şekilde değişir :

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

0

hem 48-bit EUI-48 hem de 64-bit EUI-64 MAC adresleriyle eşleşecek:

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

burada \ h [0-9a-fA-F] içindeki bir karakterdir

veya:

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

bu, '-' veya ':' kullanımına izin verir veya ayırıcı kullanılmaz


0

Belki mümkün olan en kısa:

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

Güncelleme : PHP'de MAC adreslerini doğrulamanın, hem tire hem de iki nokta üst üste biçimli MAC adreslerini destekleyen daha iyi bir yolu vardır. Filter_var () kullanın :

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

Bildiğim gibi, bu formlarda MAC adreslerini destekliyor (x: onaltılık bir sayı):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx

0

Bir MAC adresi 6 veya 20 bayt (sonsuz bant, ...) olabileceğinden, doğru cevap:

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

: ile [: -.] değiştirebilirsiniz? farklı ayırıcılar istiyorsanız veya hiçbiri istemiyorsanız.


-1

Bu küçük bir tane:

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

Birkaç karakterin veya ayırıcının garip karışımının geçebileceğini unutmayın.


-4

en iyi cevap, mac adres doğrulama normal ifadesi içindir

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.