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.