Câu trả lời:
Định dạng chuẩn (IEEE 802) để in địa chỉ MAC-48 ở dạng thân thiện với con người là sáu nhóm gồm hai chữ số thập lục phân, được phân tách bằng dấu gạch nối
-
hoặc dấu hai chấm:
.
Vì thế:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Một chút khó khăn trên mắt, nhưng điều này:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
sẽ thực thi tất cả dấu hai chấm hoặc tất cả dấu gạch ngang cho ký hiệu MAC của bạn.
(Một cách tiếp cận regex đơn giản hơn có thể cho phép A1:B2-C3:D4-E5:F6
, ví dụ, điều mà từ chối ở trên.)
:xdigit:
viết tắt của chữ số hex, ít nhiều cách nói khác [a-fA-F0-9]
. Đề \1
cập đến nhóm chụp cho dấu gạch ngang hoặc dấu hai chấm đầu tiên ([-:])
và chỉ khớp với những gì khớp với lần đầu tiên đó.
:xdigit:
(mặc dù "tốc ký" đó chỉ ngắn hơn [a-fA-F0-9]
và tương đương /[a-f0-9]/i
là ngắn hơn!)
C8:FD:19:55:E6:3A
thất bại? Đó là một địa chỉ mac thực tế. Tôi đã sửa đổi regex của bạn để :
chỉ chấp nhận /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
Cảm ơn!
Regex này phù hợp với hầu hết mọi định dạng mac, bao gồm cả định dạng của Cisco, chẳng hạn như 0102-0304-abcd
^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$
Chuỗi ví dụ mà nó khớp:
01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd
Định dạng hỗn hợp cũng sẽ được kết hợp!
aa.aa.bbbb.cccc
, chẳng hạn.
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
, và nhìn cho dòng BSSID, nếu có octet là dưới 0x10 hàng đầu thế giới không được giảm ( %x
hoặc %2x
hơn là %02x
printf
định dạng được sử dụng?)
dấu phân cách: " : ", " - ", " . "
gấp đôi hoặc đơn: 00 = 0, 0f = f
/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i
hoặc là
/^([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]
có lẽ nên được viết lại thành:[0-9a-fA-F]
Được cảnh báo rằng thuộc tính Unicode \p{xdigit}
bao gồm các phiên bản FULLWIDTH. Bạn có thể thích\p{ASCII_Hex_Digit}
thay thế.
Câu trả lời cho câu hỏi được hỏi có thể được trả lời tốt nhất - miễn là bạn đã cài đặt một mô-đun CPAN đáng kính nhất định - bằng cách nhập:
% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'
Tôi hiển thị các mẫu cụ thể mà nó xuất ra ở đây là mẫu may mắn số 13; Có nhiều người khác.
Chương trình này:
#!/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
tạo đầu ra này:
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
Có vẻ như đó là thứ bạn đang tìm kiếm.
Liên kết này có thể giúp bạn. Bạn có thể sử dụng điều này:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})
Xem câu hỏi này cũng có.
Các quy tắc như sau:
^[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}$
Phiên bản python có thể là:
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 ở trên xác nhận tất cả các loại địa chỉ mac bên dưới:
01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
dành cho nhà phát triển PHP
filter_var($value, FILTER_VALIDATE_MAC)
Tôi không nghĩ rằng RegEx chính là chính xác vì nó cũng phân loại
'3D-F2-C9:A6-B3:4F'
như một Địa chỉ MAC hợp lệ, mặc dù nó không chính xác. Câu trả lời đúng sẽ là:
((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))
Vì vậy, mỗi khi bạn có thể chọn ':' hoặc '-' cho toàn bộ địa chỉ MAC.
Bạn có thể sử dụng quy trình sau bằng cách chuyển địa chỉ mac để xác thực,
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();
}
Dân trí PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Cần giải thích: http://regex101.com/r/wB0eT7
để khớp cả hai địa chỉ MAC EUI-48 và 64 bit EUI-64:
/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/
trong đó \ h là một ký tự trong [0-9a-fA-F]
hoặc là:
/\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/
điều này cho phép '-' hoặc ':' hoặc không sử dụng dấu phân cách
Có lẽ ngắn nhất có thể:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
Cập nhật : Một cách tốt hơn tồn tại để xác thực các địa chỉ MAC trong PHP hỗ trợ cho cả địa chỉ MAC theo kiểu dấu gạch nối và kiểu dấu hai chấm. Sử dụng bộ lọc_var () :
// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);
Như tôi biết, nó hỗ trợ các địa chỉ MAC ở các dạng này (x: một số thập lục phân):
xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
Cảm ơn rất nhiều đến @Moshe vì câu trả lời tuyệt vời ở trên. Sau khi thực hiện một số nghiên cứu khác, tôi muốn thêm các phát hiện bổ sung của mình, cả về liên quan đến IEEE 802 và thực thi việc sử dụng dấu phân cách nhất quán trong regex.
Định dạng chuẩn (IEEE 802) để in địa chỉ MAC-48 ở dạng thân thiện với con người là sáu nhóm gồm hai chữ số thập lục phân, được phân tách bằng dấu gạch nối - . Tuy nhiên, quy ước được áp dụng rộng rãi cũng cho phép dấu hai chấm: và ba nhóm bốn chữ số thập lục phân cách nhau bởi các dấu chấm . .
Tín dụng đầy đủ cho @Moshe ở đây cho tuyên bố ban đầu của anh ấy và @pilcrow vì đã chỉ ra rằng IEEE 802 chỉ bao gồm các thôi miên.
Dưới đây là biểu thức chính quy thực thi phân tách tương tự được sử dụng trong toàn bộ địa chỉ mac:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
Và đây là một bổ sung cho phép sử dụng không có dải phân cách nào cả:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
Vì địa chỉ MAC có thể là 6 hoặc 20 byte (infiniband, ...), câu trả lời đúng là:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
bạn có thể thay thế: bằng [: -.]? nếu bạn muốn phân tách khác nhau hoặc không có.
câu trả lời tốt nhất là cho regex xác thực địa chỉ mac
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$