MAC 주소에 대한 정규식이란 무엇입니까?


125

이 형식에서 :

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

또는:

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

답변:


266

사람에게 친숙한 형식으로 MAC-48 주소를 인쇄하기위한 표준 (IEEE 802) 형식은 하이픈 -또는 콜론으로 구분 된 두 개의 16 진수 숫자로 구성된 6 개 그룹입니다 :.

그래서:

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

21
16 진수 소문자로 저장하는 경우 일치하지 않습니다. 그룹을 [0-9A-Fa-f]로 변경하여 두 경우를 모두 포착합니다
Scott Chamberlain

5
당신은 또한 대소 문자를 무시하고 싶을 것입니다
dietbuddha 2010

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

2
제쳐두고, "표준 형식"에 관한 위의 인용문은 802.3 표준기구가 아니라 위키 백과에서 나온 것입니다. IEEE 802-2014는 실제로 일반 MAC 주소 (§ 8.1 ¶ 3)에 하이픈 을 지정 하고 구식 비트 반전 표기법 (¶ 4)에 콜론 을 지정합니다. 중요한 것은 실제로 아무도 이것을 관찰하지 않는다는 것 입니다. 우리는 단순히 하나 또는 다른 것을 사용하지만 하나의 작성된 MAC에서 혼합하지 마십시오.
pilcrow

1
이 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 주소에 대해 ':'또는 '-'를 선택할 수 있습니다.
PyFox

23

눈에 약간 딱딱하지만 이것은 :

/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/

MAC 표기법에 모든 콜론 또는 모든 대시를 적용합니다.

( A1:B2-C3:D4-E5:F6예를 들어, 더 간단한 정규식 접근 방식은을 허용 할 수 있습니다 .


이것은 작동하지만 : xdigit가 무엇인지 설명 할 수 있습니까? 그리고 길이 뒤에 그룹 ([-:])을 넣는 것을 보았습니다. 모든 콜론이나 하이픈을 사용하는 이유는 무엇입니까?
Xaisoft

2
@Xaisoft :xdigit:는 16 진수의 줄임말로 [a-fA-F0-9]. 는 \1첫 번째 대시 또는 콜론의 캡처 그룹을 참조 ([-:])하고, 해당 처음으로 일치하는 것과 일치.
pilcrow 2010

2
캡처 링 그룹과 비 캡처 그룹을 모두 적절하게 사용하고 또한 사용하는 경우 +1 :xdigit:( "줄임"이 더 짧고 [a-fA-F0-9]동등 항목 /[a-f0-9]/i이 더 짧지 만!)
gb96

@pilcrow이 Mac이 C8:FD:19:55:E6:3A실패한 이유를 설명해 주 시겠습니까? 실제 MAC 주소입니다. 나는 허용하도록 정규식을 수정 한 :경우에만 /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/감사합니다!
Sam

1
내 마음에 이것은 ":"와 "-"의 혼합 사용을 실제로 확인하므로 더 나은 대답입니다.
Ray Oei

9

이 정규식은 다음과 같은 Cisco 형식을 포함하여 거의 모든 Mac 형식과 일치합니다. 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

혼합 형식도 일치합니다!


이것은 처음 5 개의 8 진수 뒤의 구분 기호와 일치 aa.aa.bbbb.cccc합니다. 예를 들어.
pilcrow

1
#notAllFormats는 당신이 WiFi를 가진 OSX 시스템에 대한 액세스, 실행 한 경우 /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I0x10을 아래 제로는 삭제 선도 어떤 진수 인 경우, BSSID 라인, 및 모양 ( %x또는 %2x보다는 %02x printf형식이 사용?)
nhed

8

구분자 : " : ", " - ", " . "

이중 또는 단일 : 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 ...

2
두 번째는 g와 같은 16 진수가 아닌 문자를 포함하는 문자열과 잘못 일치합니다.
Binary Phile 2015

두 번째는 문자 범위 데이터 정렬을 지원하는 BRE / ERE를 제외하고 대부분의 특징에서 유효하지 않습니다. 그러나 문자 범위 데이터 정렬에 대한 지원은 구현에 따라 다르므로 결과가 다를 수 있습니다.
nhahtdh

또 다른 한 가지는 그룹이 정확히 2 개의 16 진수를 가져야한다는 것입니다.
nhahtdh

이론적으로는 프로그램에서 반환하는 모든 mac 주소는 각 개별 그룹에서 2 개의 16 진수와 같은 표준을 따릅니다. 그러나 일부 표준화되지 않은 Unix 변형 은 선행 0이있을 때 출력을 줄이며 경우에 따라 1 개의 16 진수 문자 만 남깁니다. 따라서 {1,2}정규식 이 필요합니다
TrinitronX

그러나 문자 집합은 [0-9a-F]다음과 같이 다시 작성되어야합니다.[0-9a-fA-F]
TrinitronX

5

유니 코드 속성 \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

당신이 찾고있는 것 같은데.


5

링크 가 도움 이 될 수 있습니다. 이것을 사용할 수 있습니다.(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})


4

이 질문 도 참조하십시오 .

정규식은 다음과 같습니다.

^[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
그룹을 만들어서 단축하는 방법이 없나요? 2 개의 별도 정규식없이 정규식을 결합하여 : 또는 a-를 갖는 방법은 무엇입니까?
Xaisoft

netcoder가 제공하는 단축 형식도 작동합니다. 둘 중 하나를 사용하는 것은 MAC 주소를 캡처해야하는지 아니면 전체적으로 유효성을 검사해야하는지에 따라 달라질 수 있습니다.
JYelton 2010

전체에 대해 유효성을 검사해야하므로 모든 하이픈 또는 모든 콜론이 포함되어 있는지 확인해야합니다. 혼합이 포함 된 경우 유효한 MAC이 아닙니다.
Xaisoft

2
@Xaisoft : 내 대답의 의견에서 말했듯이 콜론과 하이픈을 혼합하는 것은 사양에 따라 유효합니다.
netcoder 2010

구분 기호가 혼합 된 MAC 주소를 가져 오는 소스는 무엇입니까? 실제 컴퓨터 / NIC에서 오는 경우 해당 문제가 없을 가능성이 큽니다. 사용자가 입력 한 데이터 인 경우 모든 구분 기호를 일관되게 만들기 위해 문자열 바꾸기를 수행하면됩니다.
JYelton 2010

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

이것은 : xdigit없이 pilcrow의 대답과 비슷합니까?
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})?$/

위의 정규식은 아래의 모든 Mac 주소 유형을 확인합니다.

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab

나는 이것이 완전하고 정확한 유일한 것이라고 생각합니다.
Vincent Sels


1

나는 또한 분류하기 때문에 주요 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 주소에 대해 ':'또는 '-'를 선택할 수 있습니다.


0

확인을 위해 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();             
}


0

이 변형과 같이 숫자 사이에 공백이 필요한 경우

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

정규식은 다음과 같이 변경 됩니다.

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

0

48 비트 EUI-48 및 64 비트 EUI-64 MAC 주소 모두 일치 :

/\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/

이렇게하면 '-'또는 ':'또는 구분 기호를 사용할 수 없습니다.


0

아마도 가능한 가장 짧은 것 :

/([\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 : 16 진수).

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx

0

위 의 훌륭한 답변에 대해 @Moshe 에게 감사드립니다 . 좀 더 많은 연구를 한 후에 IEEE 802와 관련하여 정규식에서 일관된 구분 기호 사용을 시행하는 것과 관련하여 추가 결과를 추가하고 싶습니다.

사람에게 친숙한 형식으로 MAC-48 주소를 인쇄하기위한 표준 (IEEE 802) 형식은 하이픈으로 구분 된 두 개의 16 진수 숫자 그룹 6 개입니다 . 그러나 콜론 :마침표 로 구분 된 4 개의 16 진수로 구성된 세 그룹 도 허용하는 것이 널리 채택 된 규칙 입니다. .

전체 신용 정보는 다음의 제품에 @Moshe 자신의 초기 진술 여기,하고 @pilcrow 에 대한 지적 IEEE 802 만 hypens를 다루고있다.

다음은 mac 주소 전체에 동일한 구분 기호가 사용되도록 강제하는 정규식입니다.

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$

Regex101 데모

그리고 여기에 구분 기호를 전혀 사용할 수없는 추가 항목이 있습니다.

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$

Regex101 데모


0

MAC 주소는 6 또는 20 바이트 (infiniband, ...) 일 수 있으므로 정답은 다음과 같습니다.

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

:를 [:-.]로 바꿀 수 있습니까? 다른 구분 기호를 원하거나 없음.


-1

이것은 작은 것입니다.

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

여러 문자 또는 구분 기호의 이상한 혼합이 통과 할 수 있음을 명심하십시오.


-4

가장 좋은 대답은 MAC 주소 유효성 검사 정규식입니다.

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.