MAC地址的正则表达式是什么?


125

格式如下:

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

要么:

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

Answers:


266

以易于使用的形式打印MAC-48地址的标准(IEEE 802)格式是六组,每组两个十六进制数字,中间用连字符-或冒号分隔:

所以:

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

21
请注意,如果它们以小写十六进制字母存储,则将不匹配,将组更改为[0-9A-Fa-f]以捕获这两种情况
Scott Chamberlain 2010年

5
您可能还想忽略肠衣
Dietbuddha

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

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}))|(([ 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:是十六进制数字的缩写,或多或少是另一种说法[a-fA-F0-9]。该\1指捕获组的第一个破折号或结肠([-:]),并且只匹配第一次什么匹配。
pilcrow 2010年

2
+1可以同时适当地使用捕获组和非捕获组,并且也可以使用:xdigit:(即使“简写”仅比[a-fA-F0-9]等价 /[a-f0-9]/i的短,而“简写”也更短!)
gb96 2015年

@pilcrow您能否解释一下此mac:为什么C8:FD:19:55:E6:3A失败?这是实际的mac地址。我将您的正则表达式修改为:仅接受/^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/谢谢!
山姆

1
我认为这是更好的答案,因为它实际上检查了“:”和“-”的混合使用。
雷·瓦伊

9

此正则表达式几乎与每种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
pilcrow,2015年

1
#notAllFormats如果您可以使用WiFi访问OSX系统,请运行/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I,并寻找BSSID行,如果任何八位位组都在0x10以下,则前导零将被丢弃(%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)的字符串。
Binary Phile 2015年

除了支持字符范围校对的BRE / ERE之外,第二种在大多数版本中均无效。但是,对字符范围排序规则的支持因实现而异,因此结果可能有所不同。
nhahtdh

另一件事是,组必须精确地包含2个六位数字。
nhahtdh

从理论上讲,野外程序返回的所有mac地址都将遵循某些标准,例如每个单独的组中的2个十六进制数字。但是,当前导零时,某些非标准化的Unix变体会缩短输出,在某些情况下仅留下1个十六进制字符。因此,需要{1,2}正则表达式
TrinitronX

但是,字符集from [0-9a-F]应该重写为:[0-9a-fA-F]
TrinitronX16年

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个单独的正则表达式的情况下将正则表达式组合为-或-?
Xaisoft

netcoder提供的缩写形式也将起作用。使用一个或另一个可能取决于您是需要捕获任何MAC地址还是仅对其进行整体验证。
JYelton 2010年

需要对它进行整体验证,因此它是否包含所有连字符或所有冒号。如果包含混合,则它不是有效的MAC。
Xaisoft

2
@Xaisoft:就像我在回答评论中所说的那样,根据规范,混合冒号和连字符是有效的。
netcoder 2010年

您从哪个来源获得的MAC地址可能包含多个定界符?如果它们来自实际的计算机/ NIC,则可能不会出现此问题。如果它是用户输入的数据,则只需执行字符串替换即可使所有定界符保持一致。
JYelton 2010年





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

更新:存在一种更好的方法来验证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

0

非常感谢@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}))$

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

请记住,几种字符或分隔符的奇怪混合可能会通过。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.