java不同的MAC地址正则表达式
匹配MAC地址的正确正则表达式是什么?我在谷歌上搜索了一下,但是大部分的questions and answers都是不完整的。它们只为the standard (IEEE 802) format for printing MAC-48 addresses in human-friendly form is six groups of two hexadecimal digits, separated by hyphens - or colons :.
提供了一个正则表达式,但实际情况并非如此。许多路由器、交换机和其他网络设备供应商以以下格式提供MAC地址:
3D:F2:C9:A6:B3:4F //<-- standard
3D-F2-C9-A6-B3:4F //<-- standard
3DF:2C9:A6B:34F
3DF-2C9-A6B-34F
3D.F2.C9.A6.B3.4F
3df2c9a6b34f // <-- normalized
到目前为止,我所拥有的是:
public class MacAddressFormat implements StringFormat {
@Override
public String format(String mac) throws MacFormatException {
validate(mac);
return normalize(mac);
}
private String normalize(String mac) {
return mac.replaceAll("(\\.|\\,|\\:|\\-)", "");
}
private void validate(String mac) {
if (mac == null) {
throw new MacFormatException("Empty MAC Address: !");
}
// How to combine these two regex together ?
//this one
Pattern pattern = Pattern.compile("^([0-9A-Fa-f]{2}[\\.:-]){5}([0-9A-Fa-f]{2})$");
Matcher matcher = pattern.matcher(mac);
// and this one ?
Pattern normalizedPattern = Pattern.compile("^[0-9a-fA-F]{12}$");
Matcher normalizedMatcher = normalizedPattern.matcher(mac);
if (!matcher.matches() && !normalizedMatcher.matches()) {
throw new MacFormatException("Invalid MAC address format: " + mac);
}
}
}
如何在代码中组合这两个正则表达式
# 1 楼答案
为什么有这么多代码? 以下是如何“规范化”您的mac地址:
mac.replaceAll("[^a-fA-F0-9]", "");
下面是一种验证方法:
# 2 楼答案
MAC地址可通过以下代码进行验证:
# 3 楼答案
试试这个,做得很好
MAC地址是制造商为标识而分配给大多数网络适配器或网络接口卡(NIC)的唯一标识符,IEEE 802标准使用48位或6字节表示MAC地址。此格式提供281474976710656个可能的唯一MAC地址
IEEE 802标准定义了以十六进制数字打印MAC地址的3种常用格式:
六组两个十六进制数字,由连字符(-)分隔,如01-23-45-67-89-ab
六组两个十六进制数字,由冒号(:)分隔,如01:23:45:67:89:ab
三组四位十六进制数字,由点(.)分隔,比如0123.4567.89ab
# 4 楼答案
我知道这个问题有点老了,但我认为没有一个真正好的解决方案:
要做的两个步骤
例如:
(一)
您可以通过调用
:。-是将从字符串中删除的字符
(二)
Ofc您可以使模式成为本地类变量,以提高代码的效率
# 5 楼答案
MAC地址可以是6或20字节(infiniband)
假设分隔符为:is,则正确的regexp
我们匹配5次XX:或者我们匹配另外14次XX:并且我们匹配XX
# 6 楼答案
根据AlexR的回答:
这不是很完美,因为它将匹配类似
AB:CD.EF-123456
的内容。如果您想避免这种情况,您可以比我更聪明地使它在每个位置匹配相同的字符,或者只需将两个模式拆分为一个,每个可能的分隔符。(总共六个?)