MACアドレスの正規表現とは何ですか?


125

このフォーマットでは:

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

または:

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

回答:


266

MAC-48アドレスを人にわかりやすい形式で印刷するための標準(IEEE 802)形式は、ハイフン-またはコロンで区切られた2つの16進数の6つのグループです:

そう:

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

21
それらが小文字の16進文字で格納されている場合は一致しないことに注意してください。グループを[0-9A-Fa-f]に変更して両方のケースをキャッチします
Scott Chamberlain

5
あなたはおそらく
大文字小文字の区別

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

2
余談ですが、上記の「標準形式」に関する引用は、802.3標準化団体ではなく、Wikipediaからのものです。IEEE 802-2014は、実際には通常のMACアドレスのハイフン( §8.1¶3 )と廃止されたビット反転表記のコロン(¶4)を指定しています。重要なことに、実際には誰もこれを観察しません。私たちは単にどちらか一方を使用しますが、1つの記述されたMACでそれらを決して混合しません。
ピルクロウ2015

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 2010年

2
@Xaisoft :xdigit:は16進数の略で、多かれ少なかれ別の言い方[a-fA-F0-9]です。\1最初のダッシュまたはコロンのためのキャプチャグループを指し([-:])、そして唯一のその最初の時間に一致したものと一致します。
ピルクロー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}$/
サム

1
「:」と「-」の混合使用を実際にチェックするので、私の考えではこれがより良い答えです。
Ray

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つのオクテットの後の区切り文字に一致aa.aa.bbbb.ccccします。たとえば、を受け入れます。
ピルクロウ2015年

1
#notAllFormatsあなたはWi-Fi付きのOSXシステムへのアクセス、実行した場合は/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I任意のオクテットはゼロをリードする0x10の下にある場合、および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
2番目は、gなどの非16進文字を含む文字列と誤って一致します。
Binary Phile 2015

2番目のものは、文字範囲の照合をサポートするBRE / EREを除いて、ほとんどのフレーバーでは無効です。ただし、文字範囲照合のサポートは実装によって異なるため、結果は異なる場合があります。
nhahtdh、2015年

もう1つは、グループの正確な桁数が2桁である必要があることです。
nhahtdh

理論的には、実際にプログラムによって返されるすべてのMACアドレスは、各グループごとに2桁の16進数のような標準に従います。ただし、一部の標準化されていないUnixバリアントは、先頭にゼロがある場合に出力を短縮し、場合によっては1つの16進文字しか残しません。したがって、{1,2}正規表現の必要性
TrinitronX

しかし、からの文字セットは[0-9a-F]:おそらくのように書き換えるべきである[0-9a-fA-F]
TrinitronX

5

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

あなたが探しているようなもののようです。



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 2010年

netcoderが提供する短縮形も機能します。どちらか一方を使用するかどうかは、MACアドレスのいずれかをキャプチャする必要があるか、それとも全体的にそれを検証する必要があるかに基づいています。
JYelton 2010年

全体を検証する必要があるため、すべてのハイフンまたはすべてのコロンが含まれている場合。混在している場合、有効なMACではありません。
Xaisoft 2010年

2
@Xaisoft:回答のコメントで述べたように、コロンとハイフンの混在は仕様に従って有効です。
netcoder、2011年

区切り文字が混在している可能性のあるMACアドレスをどのソースから取得していますか?それらが実際のマシン/ NICからのものである場合、おそらくその問題は発生しないでしょう。ユーザーが入力したデータの場合は、文字列の置換を実行して、すべての区切り文字を一致させます。
JYelton 2010年

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

これはpilcrowの答えに似ていますが、:xdigitがありませんか?
Xaisoft 2010年


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)形式は、ハイフンで区切られた2つの16進数の6つのグループです。ただし、コロン:、およびピリオドで区切られた4つの16進数の3つのグループも許可することは、広く採用されている規則です。

彼の最初の声明はここの@Mosheに、そしてIEEE 802はハイフンしかカバーしていないことを指摘した@pilcrowへの完全な功績です。

MACアドレス全体で同じセパレータが使用されることを強制する正規表現は次のとおりです。

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

Regex101デモ

そして、これはセパレータをまったく使用しない追加の1つです:

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

Regex101デモ


0

MACアドレスは6バイトまたは20バイト(インフィニバンドなど)になる可能性があるため、正しい答えは次のとおりです。

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

:を[:-。]に置き換えることができますか?別のセパレータが必要な場合、または何も必要ない場合。


-1

これは小さなものです:

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

いくつかの文字やセパレータの奇妙な組み合わせが通過する可能性があることを覚えておいてください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.