回答:
MAC-48アドレスを人にわかりやすい形式で印刷するための標準(IEEE 802)形式は、ハイフン
-
またはコロンで区切られた2つの16進数の6つのグループです:
。
そう:
^([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
たとえば、より簡単な正規表現アプローチでは、上記が拒否されるが許可される場合があります。)
:xdigit:
は16進数の略で、多かれ少なかれ別の言い方[a-fA-F0-9]
です。\1
最初のダッシュまたはコロンのためのキャプチャグループを指し([-:])
、そして唯一のその最初の時間に一致したものと一致します。
:xdigit:
(その「省略形」は、単により短く[a-fA-F0-9]
、同等のもの /[a-f0-9]/i
はより短いですが!)
C8:FD:19:55:E6:3A
失敗したのか説明していただけますか 実際のMACアドレスです。ありがとう:
のみを受け入れるように正規表現を変更しました/^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
。
この正規表現は、次のような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
混合フォーマットもマッチします!
aa.aa.bbbb.cccc
します。たとえば、を受け入れます。
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
任意のオクテットはゼロをリードする0x10の下にある場合、およびBSSIDラインの外観を、ドロップ(さ%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}
正規表現の必要性
[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})
この質問も参照してください。
次の正規表現:
^[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}$
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})?$/
上記の正規表現は、以下のすべてのMACアドレスタイプを検証します。
01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
PHP開発者向け
filter_var($value, FILTER_VALIDATE_MAC)
PHPフォーク:
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
おそらく最短:
/([\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
上記の素晴らしい答えを@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}))$
そして、これはセパレータをまったく使用しない追加の1つです:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$