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

格式如下:

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

或:

3D-F2-C9-A6-B3-4F
219776 次浏览

另见 这个问题

正则表达式如下:

^[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}$

标准(IEEE802)格式 打印 MAC-48地址 人类友好的形式是六组 两个十六进制数字,由 连字符 -或冒号 :

所以:

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

看起来有点刺眼,但是这个:

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

将强制所有冒号或所有破折号为您的 MAC 符号。

(一个更简单的正则表达式方法可能允许 A1:B2-C3:D4-E5:F6,例如,上面的拒绝。)

请注意,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})

最好的答案是 mac 地址验证正则表达式

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$

分隔符: “ :”,“ -”,“ .

双倍或单倍: 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 ...

这个正则表达式几乎匹配所有的 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

混合格式也将匹配!

通过传递 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();
}

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

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

如果数字之间需要空格,比如这个变体

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

正则表达式 改变

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

匹配48位 EUI-48和64位 EUI-64 MAC 地址:

/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/

在[0-9a-fA-F ]中 h 是哪个字符

或:

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

这允许使用“-”或“ :”或不使用分隔符

如果使用 PHP,可以使用 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

也许是最短的,在 PCRE (Perl 兼容的正则表达式,例如在 PHP 中使用)中:

/([\da-f]{2}[:-]){5}[\da-f]{2}/i

非常感谢 @ 摩西答得好以上。在做了更多的研究之后,我想补充一下我的额外发现,无论是关于 IEEE 802还是在正则表达式中强制使用一致的分隔符。

中打印 MAC-48地址的标准(IEEE 802)格式 人类友好的形式是六组两个十六进制数字,分开 但是,广泛采用的惯例是也允许 结肠:, 以及由 经期。分隔的三组四个十六进制数字。

这里完全归功于 @ 摩西的初始声明,而对于 指出@ PilCrow,IEEE 802只涵盖了连字符。

下面是一个正则表达式,它强制在整个 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演示

由于 MAC 地址可以是6或20字节(无限带,...) ,正确答案是:

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

如果需要不同的分隔符或不需要分隔符,您可以将: 替换为[ :-. ]。

我不认为主要的正则表达式是正确的,因为它也分类

'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-9A-F]{2}[:-]?){6})

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

Mac 地址可以是 48位还是64位。

ad:12:13:fc:14:ee // 48 bit, with colons
ad-12-13-fc-14-ee // 48 bit, with dashes
ad1213fc14ee      // 48 bit, without any delimiter
AD:12:13:FC:14:EE // 48 bit, uppercase.


AD:12:13:FC:14:EE:FF:FF // 64 bit, uppercase
ad:12:13:fc:14:ee:13:ad // 64 bit, lowercase
ad-12-13-fc-14-ee-ff-ad // 64 bit, with dashes
ad1213fc14eeffae        // 64 bit, without any delimter

如果您正在寻找一个正则表达式,它可以验证以上两种情况以及所有的情况(这些情况都是有效的) ,那么下面的方法可以奏效:

对于48位,我们可以使用这个:

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

对于64位,我们可以使用这个:

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

如果您正在寻找一个正则表达式来验证这两种类型的 mac 地址,那么使用 OR 运算符连接它们。

这可以用我的 MAC 地址在升华测试 这个解决方案将只与理想的 MAC 地址工作,将看起来像这样. . XX:XX:XX:XX:XX:XX

(([a-fA-F0-9]{2}[:]){5}[a-fA-F0-9]{2})

思科格式 :

([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}

比赛:

1111.abcd.2222