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

时间:2010-11-23 20:17:02

标签: regex

采用以下格式:

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

或:

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

22 个答案:

答案 0 :(得分:239)

  

标准(IEEE 802)格式   打印MAC-48地址   人性化的形式是六组   两个十六进制数字,用。分隔   连字符-或冒号:

所以:

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

答案 1 :(得分:20)

眼睛有点硬,但是这个:

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

将强制执行MAC表示法的所有冒号或所有破折号。

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

答案 2 :(得分:7)

这个正则表达式几乎匹配每种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

混合格式也将匹配!

答案 3 :(得分:6)

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

double或single: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 ...

答案 4 :(得分:4)

警告Unicode属性\p{xdigit}包含FULLWIDTH版本。您可能更喜欢\p{ASCII_Hex_Digit}

如果您安装了某个令人尊敬的CPAN模块,可以通过输入以下内容来回答问题的答案:

% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'

我将here输出的特定模式显示为幸运模式编号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

这似乎是你正在寻找的东西。

答案 5 :(得分:4)

link可能会对您有所帮助。您可以使用此:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})

答案 6 :(得分:2)

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

答案 7 :(得分:2)

另见this question

正则表达如下:

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

答案 8 :(得分:1)

python版本可以是:

re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)

答案 9 :(得分:1)

for PHP developer

filter_var($value, FILTER_VALIDATE_MAC)

答案 10 :(得分:1)

/^(([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

答案 11 :(得分:0)

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

答案 12 :(得分: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();             
}

答案 13 :(得分:0)

如果您需要数字之间的空格,例如此变体

 @property (nonatomic, strong, readonly) UIView *currentItemView;

正则表达式更改为

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

答案 14 :(得分: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/

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

答案 15 :(得分: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

答案 16 :(得分:0)

非常感谢@Moshe以上的great answer。经过更多研究后,我想补充一下我的其他发现,包括关于IEEE 802和在正则表达式中强制使用一致的分隔符。

  

用于打印MAC-48地址的标准(IEEE 802)格式   对人类友好的形式是六组,每组两个十六进制数字   通过连字符-。但是,被广泛采用的惯例也允许冒号,   以及由句点。隔开的三组四个十六进制数字。

这里对@Moshe的最初声明表示敬意,对@pilcrowpointing out表示敬意,IEEE 802仅涵盖连字符。

这是一个正则表达式,强制在整个mac地址中使用相同的分隔符:

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

Regex101 demo

这是另外一个,它根本不使用分隔符:

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

Regex101 demo

答案 17 :(得分:0)

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

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

您可以用[:-。]替换:吗?如果您要使用其他分隔符或不使用分隔符。

答案 18 :(得分:0)

我认为主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地址选择“:”或“-”。

答案 19 :(得分:0)

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 运算符来连接它们。

答案 20 :(得分:-1)

这是一个很小的:

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

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

答案 21 :(得分:-4)

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

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