【发布时间】:2023-01-12 23:32:42
【问题描述】:
在这种格式中:
3D:F2:C9:A6:B3:4F
或者:
3D-F2-C9-A6-B3-4F
【问题讨论】:
标签: regex
在这种格式中:
3D:F2:C9:A6:B3:4F
或者:
3D-F2-C9-A6-B3-4F
【问题讨论】:
标签: regex
标准 (IEEE 802) 格式 在中打印 MAC-48 地址 人类友好的形式是六组 两个十六进制数字,由 连字符
-或冒号:。所以:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
【讨论】:
眼睛有点硬,但是这个:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}){4}[[:xdigit:]]{2}$/
将为您的 MAC 符号强制执行所有冒号或所有破折号。
(例如,更简单的正则表达式方法可能允许 A1:B2-C3:D4-E5:F6,上面拒绝了。)
【讨论】:
:xdigit: 是十六进制数字的缩写,或多或少是[a-fA-F0-9] 的另一种说法。 指的是第一个破折号或冒号([-:]) 的捕获组,并且只匹配第一次匹配的内容。
:xdigit:(即使“速记”仅比[a-fA-F0-9] 短,而等效的/[a-f0-9]/i 更短!)
C8:FD:19:55:E6:3A 失败了吗?这是一个实际的mac地址。我修改了您的正则表达式以仅接受: /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}){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}'
我将它输出的特定模式 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
", $_ => /$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
这似乎是您正在寻找的那种东西。
【讨论】:
这个link 可能对你有帮助。你可以使用这个:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}.){2}[0-9A-Fa-f]{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}$
【讨论】:
非常感谢 @Moshe 上面的 great answer。在做了更多研究之后,我想添加我的额外发现,包括关于 IEEE 802 和在正则表达式中强制使用一致的分隔符。
用于打印 MAC-48 地址的标准 (IEEE 802) 格式 人类友好的形式是六组两个十六进制数字,分开 经过连字符 -.然而,广泛采用的惯例也允许冒号 :, 和三组四个十六进制数字,由期间。.
完全感谢 @Moshe 的初始声明,@pilcrow 的 pointing out IEEE 802 仅涵盖连字符。
这是一个正则表达式,它强制在整个 mac 地址中使用相同的分隔符:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:[0-9A-Fa-f]{2}){5}))$这里还有一个完全不使用分隔符的:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:[0-9A-Fa-f]{2}){5}))$
【讨论】:
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
【讨论】:
如果您使用的是 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
【讨论】:
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
【讨论】:
我不认为主要的 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 地址选择“:”或“-”。
【讨论】:
a-zA-z0-9 更改为 a-fA-F0-9 mac 是十六进制