Biểu thức chính quy cho Địa chỉ MAC là gì?


125

Trong định dạng này:

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

hoặc là:

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

Câu trả lời:


266

Đị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})$

21
Lưu ý rằng nếu chúng đang được lưu trữ với các chữ cái thập lục phân thường, nó sẽ không khớp thay đổi nhóm thành [0-9A-Fa-f] để bắt cả hai trường hợp
Scott Chamberlain

5
có lẽ bạn cũng muốn bỏ qua vỏ bọc
dietbuddha

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

2
Bên cạnh đó, trích dẫn ở trên liên quan đến "định dạng tiêu chuẩn" xuất phát từ Wikipedia, không phải cơ quan tiêu chuẩn 802.3. IEEE 802-2014 thực sự chỉ định dấu gạch nối cho các địa chỉ MAC thông thường (§ 8.1 ¶ 3) và dấu hai chấm cho ký hiệu đảo ngược bit lỗi thời (4). Điều quan trọng, trong thực tế, không ai quan sát điều này . Chúng tôi chỉ đơn giản sử dụng cái này hoặc cái kia, nhưng không bao giờ trộn chúng trong một MAC được viết.
hương

1
Tôi không nghĩ rằng RegEx này là chính xác vì nó cũng phân loại '3D-F2-C9: A6-B3: 4F' là một Địa chỉ MAC hợp lệ, mặc dù nó không chính xác. Câu đú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.
PyFox

23

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.)


Điều này hoạt động, nhưng bạn có thể giải thích những gì: xdigit là gì? và tôi nhận thấy bạn đặt nhóm ([-:]) sau độ dài, điều gì làm cho tất cả các dấu hai chấm hoặc dấu gạch nối?
Xaisoft

2
@Xaisoft, :xdigit:viết tắt của chữ số hex, ít nhiều cách nói khác [a-fA-F0-9]. Đề \1cậ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 đó.
hương

2
+1 để sử dụng cả hai nhóm bắt và không bắt một cách thích hợp và cũng để sử dụng :xdigit:(mặc dù "tốc ký" đó chỉ ngắn hơn [a-fA-F0-9]và tương đương /[a-f0-9]/ilà ngắn hơn!)
gb96

@pilcrow bạn có thể vui lòng giải thích tại sao mac này: C8:FD:19:55:E6:3Athấ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!
Sam

1
Trong tâm trí tôi đây là câu trả lời tốt hơn vì nó thực sự kiểm tra việc sử dụng hỗn hợp ":" và "-".
Ray Oei

9

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!


Điều này sẽ khớp với các dấu phân cách sau bất kỳ năm octet đầu tiên nào, có nghĩa là nó sẽ chấp nhận aa.aa.bbbb.cccc, chẳng hạn.
hương

1
#notAllFormats Nếu bạn đã truy cập vào một hệ thống với WiFi OSX, chạy /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 ( %xhoặc %2xhơn là %02x printfđịnh dạng được sử dụng?)
nhed

8

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 ...

2
Chuỗi thứ hai sẽ khớp không chính xác các chuỗi chứa các ký tự không phải là hex như g.
Phile nhị phân

Loại thứ hai không hợp lệ trong hầu hết các hương vị, ngoại trừ BRE / ERE, hỗ trợ đối chiếu phạm vi ký tự. Tuy nhiên, hỗ trợ đối chiếu phạm vi ký tự khác nhau giữa các lần thực hiện, do đó kết quả có thể khác nhau.
nhahtdh

Một điều nữa là các nhóm phải có chính xác 2 chữ số hexa.
nhahtdh

Về lý thuyết, tất cả các địa chỉ mac được trả về bởi các chương trình trong tự nhiên sẽ tuân theo một số tiêu chuẩn như 2 chữ số hex trong mỗi nhóm riêng biệt. Tuy nhiên, một số biến thể Unix không được chuẩn hóa rút ngắn đầu ra khi có số 0 đứng đầu, chỉ để lại 1 hex char trong một số trường hợp. Do đó, cần có {1,2}regex
TrinitronX

Tuy nhiên, bộ ký tự [0-9a-F]có lẽ nên được viết lại thành:[0-9a-fA-F]
TrinitronX

5

Đượ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.


5

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


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}$

1
Không có cách nào để rút ngắn nó bằng cách làm các nhóm? và làm cách nào tôi có thể kết hợp biểu thức chính quy để có a: hoặc a - mà không có 2 biểu thức chính quy riêng biệt?
Xaisoft

Hình thức rút gọn mà netcoder cung cấp cũng sẽ hoạt động. Việc sử dụng cái này hay cái kia có thể dựa trên việc bạn cần nắm bắt bất kỳ địa chỉ MAC nào hay chỉ xác nhận nó trên toàn bộ.
JYelton

Nó cần phải được xác nhận trên toàn bộ, vì vậy nếu nó có chứa tất cả các dấu gạch nối hoặc tất cả các dấu hai chấm. Nếu nó chứa hỗn hợp, nó không phải là MAC hợp lệ.
Xaisoft

2
@Xaisoft: Giống như tôi đã nói trong nhận xét của tôi, trộn dấu hai chấm và dấu gạch nối là hợp lệ theo đặc điểm kỹ thuật.
netcoder

Nguồn nào bạn nhận được địa chỉ MAC từ đó có thể có sự kết hợp của các dấu phân cách? Nếu chúng đến từ một máy / NIC thực tế, bạn có thể sẽ không gặp phải vấn đề đó. Nếu đó là dữ liệu do người dùng nhập, chỉ cần thực hiện thay thế chuỗi để làm cho tất cả các dấu phân cách nhất quán.
JYelton

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

Điều này có giống với câu trả lời của người hành hương không, chỉ cần không có: xdigit?
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})?$/

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

Tôi nghĩ rằng đây là người duy nhất hoàn chỉnh và chính xác.
Vincent Sels


1

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.


0

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


0

Nếu bạn cần khoảng trắng giữa các số, như biến thể này

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

Regex thay đổi thành

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

0

để 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


0

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

0

Cảm ơn rất nhiều đến @Moshecâ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}))$

Bản demo Regex101

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

Bản demo Regex101


0

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ó.


-1

Đây là một cái nhỏ:

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

Hãy nhớ rằng, sự pha trộn kỳ lạ của một vài ký tự hoặc dấu phân cách có thể vượt qua.


-4

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])$
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.