Yanıtlar:
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})$
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 .)
: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.
:xdigit:
(bu "steno" sadece daha kısa [a-fA-F0-9]
ve eşdeğeri /[a-f0-9]/i
daha kısa olsa bile !)
C8:FD:19:55:E6:3A
baş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 !
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!
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 .
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
ve BSSID satırını arayın, herhangi bir sekizli %x
%2x
%02x
printf
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 ...
{1,2}
normal
[0-9a-F]
muhtemelen şu şekilde yeniden yazılması gerekir:[0-9a-fA-F]
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.
Bu bağlantı size yardımcı olabilir. Bunu kullanabilirsiniz:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{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}$
Python sürümü şu şekilde olabilir:
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})?$/
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
PHP geliştiricisi için
filter_var($value, FILTER_VALIDATE_MAC)
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}))$
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}))$
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.
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();
}
PHP Halkları:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Açıklama Gerekiyor: http://regex101.com/r/wB0eT7
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
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
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.
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])$