ในรูปแบบนี้:
3D:F2:C9:A6:B3:4F
หรือ:
3D-F2-C9-A6-B3-4F
ในรูปแบบนี้:
3D:F2:C9:A6:B3:4F
หรือ:
3D-F2-C9-A6-B3-4F
คำตอบ:
มาตรฐาน (IEEE 802) รูปแบบสำหรับการพิมพ์ MAC-48 ที่อยู่ในรูปแบบที่เป็นมิตรกับมนุษย์เป็นกลุ่มหกของตัวเลขสองหลักเลขฐานสิบหกแยกจากกันโดยยัติภังค์หรือทวิภาค
-
:
ดังนั้น:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
ยากเล็กน้อยในสายตา แต่สิ่งนี้:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
จะบังคับใช้เครื่องหมายทวิภาคทั้งหมดหรือขีดกลางทั้งหมดสำหรับสัญกรณ์ MAC ของคุณ
( A1:B2-C3:D4-E5:F6
ตัวอย่างเช่นวิธีการ regex ที่ง่ายกว่าอาจอนุญาตซึ่งวิธีการข้างต้นปฏิเสธ)
:xdigit:
หมายถึงกลุ่มการจับภาพสำหรับการประแรกหรือลำไส้ใหญ่และมีเพียงตรงกับสิ่งที่จับคู่ว่าเป็นครั้งแรก [a-fA-F0-9]
\1
([-:])
:xdigit:
(แม้ว่า "ชวเลข" นั้นจะสั้นกว่า[a-fA-F0-9]
และเทียบเท่า /[a-f0-9]/i
ก็สั้นกว่า!)
C8:FD:19:55:E6:3A
ล้มเหลว? มันเป็นที่อยู่ของ mac จริงๆ ฉันแก้ไข regex ของคุณเพื่อยอมรับ:
แต่/^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
ขอบคุณ!
regex นี้ตรงกับ mac ทุกรูปแบบรวมถึงรูปแบบ Cisco เช่น 0102-0304-abcd
^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$
ตัวอย่างสตริงที่ตรงกับ:
01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd
รูปแบบผสมจะถูกจับคู่ด้วย!
aa.aa.bbbb.cccc
เป็นต้น
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
และมองหาบรรทัด BSSID หากอ็อกเต็ตใด ๆ ที่อยู่ต่ำกว่า 0x10 ศูนย์นำหน้าจะหลุด ( %x
หรือ%2x
แทนที่จะ%02x
printf
ใช้รูปแบบ?)
ตัวคั่น: " : ", " - ", " . "
คู่หรือเดี่ยว: 00 = 0, 0f = f
/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i
หรือ
/^([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]
ควรจะเขียนใหม่เป็น:[0-9a-fA-F]
ขอเตือนว่าคุณสมบัติ Unicode \p{xdigit}
ประกอบด้วยเวอร์ชัน FULLWIDTH คุณอาจต้องการ\p{ASCII_Hex_Digit}
แทน
คำตอบสำหรับคำถามที่ถามอาจเป็นคำตอบที่ดีที่สุด - หากคุณมีโมดูล CPAN ที่น่าเคารพติดตั้งไว้ - โดยพิมพ์:
% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
ผมแสดงรูปแบบโดยเฉพาะอย่างยิ่งมันจะออกผลลัพธ์ที่นี่เป็นจำนวนรูปแบบโชคดี 13; มีคนอื่น ๆ อีกมากมาย
โปรแกรมนี้:
#!/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
สร้างผลลัพธ์นี้:
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
ซึ่งดูเหมือนเป็นสิ่งที่คุณกำลังมองหา
ลิงค์นี้อาจช่วยคุณได้ คุณสามารถใช้สิ่งนี้:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})
ดูคำถามนี้ด้วย
Regexes ดังต่อไปนี้:
^[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}$
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
เวอร์ชัน python อาจเป็น:
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 ด้านบนตรวจสอบความถูกต้องของที่อยู่ mac ทุกประเภทด้านล่าง:
01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
สำหรับนักพัฒนา PHP
filter_var($value, FILTER_VALIDATE_MAC)
ขอบคุณ@Mosheมากสำหรับคำตอบที่ดีข้างต้น หลังจากทำการวิจัยเพิ่มเติมแล้วฉันต้องการเพิ่มการค้นพบพิเศษของฉันทั้งในส่วนที่เกี่ยวกับ IEEE 802 และบังคับใช้การใช้ตัวคั่นที่สอดคล้องกันใน regex
มาตรฐาน (IEEE 802) รูปแบบสำหรับการพิมพ์ MAC-48 ที่อยู่ในรูปแบบที่เป็นมิตรกับมนุษย์เป็นกลุ่มหกของตัวเลขสองหลักเลขฐานสิบหกแยกจากกันโดยยัติภังค์ - อย่างไรก็ตามอนุสัญญาที่นำมาใช้กันอย่างแพร่หลายยังอนุญาตให้โคลอน:และสามกลุ่มของเลขฐานสิบหกสี่หลักคั่นด้วยจุด .
เครดิตเต็มไป@Mosheที่นี่สำหรับคำสั่งแรกของเขาและเพื่อ@pilcrowสำหรับการชี้ให้เห็นว่ามาตรฐาน IEEE 802 ครอบคลุมเฉพาะ hypens
นี่คือนิพจน์ทั่วไปที่บังคับให้ใช้ตัวคั่นเดียวกันตลอดที่อยู่ mac:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
และนี่คือส่วนเพิ่มเติมที่อนุญาตให้ใช้โดยไม่มีตัวคั่นเลย:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
ฉันไม่คิดว่า RegEx หลักจะถูกต้องเนื่องจากยังจำแนกประเภท
'3D-F2-C9:A6-B3:4F'
เป็นที่อยู่ MAC ที่ถูกต้องแม้ว่าจะไม่ถูกต้องก็ตาม สิ่งที่ถูกต้องคือ:
((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))
ดังนั้นทุกครั้งที่คุณสามารถเลือก ':' หรือ '-' สำหรับที่อยู่ MAC ทั้งหมด
คุณสามารถใช้ขั้นตอนต่อไปนี้โดยส่งที่อยู่ mac เพื่อตรวจสอบความถูกต้อง
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 Folks:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
ต้องการคำอธิบาย: http://regex101.com/r/wB0eT7
หากคุณต้องการช่องว่างระหว่างตัวเลขเช่นตัวแปรนี้
3D : F2 : C9 : A6 : B3 : 4F
regex เปลี่ยนเป็น
"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"
เพื่อให้ตรงกับที่อยู่ MAC EUI-48 และ 64 บิต EUI-64 64 บิต:
/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/
โดยที่ \ h เป็นอักขระใน [0-9a-fA-F]
หรือ:
/\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/
สิ่งนี้อนุญาตให้ใช้ "-" หรือ ":" หรือไม่มีการใช้ตัวคั่น
อาจจะสั้นที่สุด:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
อัปเดต : มีวิธีที่ดีกว่าในการตรวจสอบที่อยู่ MAC ใน PHP ซึ่งรองรับที่อยู่ MAC ทั้งสไตล์ยัติภังค์และรูปแบบโคลอน ใช้filter_var () :
// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);
อย่างที่ฉันรู้มันรองรับที่อยู่ MAC ในรูปแบบเหล่านี้ (x: เลขฐานสิบหก):
xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
เนื่องจากที่อยู่ MAC สามารถมีขนาด 6 หรือ 20 ไบต์ (infiniband, ... ) คำตอบที่ถูกต้องคือ:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
คุณสามารถแทนที่: ด้วย [: -.]? ถ้าคุณต้องการตัวคั่นอื่นหรือไม่มีเลย
อันนี้เป็นอันเล็ก:
(([0-9A-F]{2}[:-]?){6})
โปรดทราบว่าการผสมแปลก ๆ ของตัวอักษรหรือตัวคั่นหลายตัวสามารถผ่านได้
คำตอบที่ดีที่สุดคือ regex สำหรับการตรวจสอบที่อยู่ mac
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$