Answers:
以易于使用的形式打印MAC-48地址的标准(IEEE 802)格式是六组,每组两个十六进制数字,中间用连字符
-
或冒号分隔:
。
所以:
^([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:
是十六进制数字的缩写,或多或少是另一种说法[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}$/
谢谢!
此正则表达式几乎与每种mac格式匹配,包括Cisco格式,例如 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
,并寻找BSSID行,如果任何八位位组都在0x10以下,则前导零将被丢弃(%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-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'));
可能是最短的:
/([\da-f]{2}[:-]){5}[\da-f]{2}/i
更新:存在一种更好的方法来验证PHP中的MAC地址,该地址同时支持连字符样式和冒号样式的MAC地址。使用filter_var():
// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);
据我所知,它支持以下形式的MAC地址(x:十六进制数):
xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
非常感谢@Moshe做出的上述出色回答。经过更多研究后,我想补充一下我的其他发现,包括关于IEEE 802和在正则表达式中强制使用一致的分隔符。
以易于使用的形式打印MAC-48地址的标准(IEEE 802)格式是六组,每组两个十六进制数字,中间用连字符-分隔。但是,被广泛采用的约定也允许冒号:和三组,每组四个十六进制数字,中间用句点分隔。。
全部信贷@Moshe这里他最初的陈述,并@pilcrow为指出的是IEEE 802只涵盖hypens。
这是一个正则表达式,强制在整个mac地址中使用相同的分隔符:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
这是另外一个,它根本不使用分隔符:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
由于MAC地址可以是6或20个字节(infiniband,...),正确的答案是:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
您可以用[:-。]替换:吗?如果要使用其他分隔符或不使用。
最佳答案是Mac地址验证正则表达式
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$