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

Regex 什么是MAC地址的正则表达式?,regex,Regex,以这种格式: 3D:F2:C9:A6:B3:4F 或: 另见 正则表达式如下: ^[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}$ 的标准(IEEE 802)格式 在中打印MAC-48地址 人类友好的形式是六组 两个十六进制数字,用分隔符分隔 连字符

以这种格式:

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

另见

正则表达式如下:

^[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}$
的标准(IEEE 802)格式 在中打印MAC-48地址 人类友好的形式是六组 两个十六进制数字,用分隔符分隔 连字符
-
或冒号

因此:


眼睛有点难看,但这:

/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
将强制MAC符号使用所有冒号或破折号


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

请注意,Unicode属性
\p{xdigit}
包括全宽版本。您可能更喜欢
\p{ASCII\u Hex\u 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

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

这可能会对你有所帮助。你可以使用这个:
([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



此正则表达式几乎匹配所有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'));

需要说明:

python版本可能是:

re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
上面的正则表达式验证以下所有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/
其中\h是[0-9a-fA-F]中的字符

或:


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

如果您使用的是PHP,则可以使用:

//如果$macAddress是有效的MAC地址,则返回$macAddress
filter\u var($macAddress,filter\u VALIDATE\u MAC);
看起来,它支持以下形式的MAC地址(x:十六进制数):


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

非常感谢您的支持。在做了更多的研究之后,我想补充我的额外发现,包括IEEE 802和在正则表达式中强制使用一致的分隔符

用于在中打印MAC-48地址的标准(IEEE 802)格式 人性化的形式是六组两个十六进制数字,分开 通过连字符-。然而,广泛采用的惯例还允许冒号:, 和三组四位十六进制数字,以句号分隔。

他最初的声明完全归功于此,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})$

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

我认为主正则表达式不正确,因为它也进行分类

'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}$
^[0-9A-Fa-f]{2}([:-]?)(?:[0-9A-Fa-f]{2}\1){6}[0-9A-Fa-f]{2}$
对于64位,我们可以使用:

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

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

是否有办法通过分组来缩短它?我如何组合正则表达式,使其既有a:又有a-,而不需要两个单独的正则表达式呢?netcoder提供的缩写形式也可以。使用一个或另一个可能取决于您是否需要捕获任何MAC地址或只是对其进行整体验证。它需要对其进行整体验证,因此如果它包含所有连字符或冒号。如果它包含混合,则它不是有效的MAC。@Xaisoft:正如我在回答的注释中所说,根据规范,冒号和连字符的混合是有效的。您从哪个来源获得的MAC地址可能混合了分隔符?如果它们来自实际的机器/NIC,则可能不会出现该问题。如果是用户输入的数据,只需执行字符串替换以使所有分隔符一致。请注意,如果它们是以小写十六进制字母存储的,则不会匹配将组更改为[0-9A-Fa-f]以捕获这两种情况。您可能还希望忽略大小写^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa f]{2}$,作为旁注,上面有关“标准格式”的引文来自维基百科,而不是802.3标准机构。IEEE 802-2014实际上指定了普通MAC地址的连字符(§8.1¨3)和废弃位反转符号(¨4)的冒号。重要的是,在实践中,没有人观察到这一点。我们只是简单地使用其中一个,但决不能将它们混合在一个单独的书面MAC中。我认为这个正则表达式不正确,因为它还将“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-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
'3D-F2-C9:A6-B3:4F' 
((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))
(([0-9A-F]{2}[:-]?){6})
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
^[0-9A-Fa-f]{2}([:-]?)(?:[0-9A-Fa-f]{2}\1){4}[0-9A-Fa-f]{2}$
^[0-9A-Fa-f]{2}([:-]?)(?:[0-9A-Fa-f]{2}\1){6}[0-9A-Fa-f]{2}$