5

匹配 MAC 地址的正确正则表达式是什么?我对此进行了谷歌搜索,但是大多数问题和答案都不完整。它们只提供了一个正则表达式, 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);
    }

  }
}

如何在代码中结合这两个正则表达式?

4

7 回答 7

5

为什么这么多代码?以下是如何“规范化”您的 mac 地址的方法:

mac.replaceAll("[^a-fA-F0-9]", "");

这是一种验证方法:

public boolean validate(String mac) {
   Pattern p = Pattern.compile("^([a-fA-F0-9][:-]){5}[a-fA-F0-9][:-]$");
   Matcher m = p.matcher(mac);
   return m.find();
}
于 2013-05-30T06:44:56.590 回答
2

试试这个,完美运行..

MAC 地址是制造商分配给大多数网络适配器或网络接口卡 (NIC) 的唯一标识符,用于标识,IEEE 802 标准使用 48 位或 6 字节来表示 MAC 地址。这种格式提供了 281,474,976,710,656 个可能的唯一 MAC 地址。

IEEE 802 标准定义了 3 种常用格式以十六进制数字打印 MAC 地址:

六组由连字符 (-) 分隔的两个十六进制数字,例如 01-23-45-67-89-ab

六组由冒号 (:) 分隔的两个十六进制数字,例如 01:23:45:67:89:ab

三组由点 (.) 分隔的四个十六进制数字,例如 0123.4567.89ab

public boolean macValidate(String mac) {
        Pattern p = Pattern.compile("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$");
        Matcher m = p.matcher(mac);
        return m.find();
}
于 2017-02-23T09:05:23.257 回答
0

根据 AlexR 的回答:

private static Pattern patternMacPairs = Pattern.compile("^([a-fA-F0-9]{2}[:\\.-]?){5}[a-fA-F0-9]{2}$");
private static Pattern patternMacTriples = Pattern.compile("^([a-fA-F0-9]{3}[:\\.-]?){3}[a-fA-F0-9]{3}$");

private static boolean isValidMacAddress(String mac)
{
    // Mac addresses usually are 6 * 2 hex nibbles separated by colons,
    // but apparently it is legal to have 4 * 3 hex nibbles as well,
    // and the separators can be any of : or - or . or nothing.
    return (patternMacPairs.matcher(mac).find() || patternMacTriples.matcher(mac).find());
}

这不是很完美,因为它会匹配类似AB:CD.EF-123456. 如果你想避免这种情况,你可以比我更聪明,让它在每个地方匹配相同的字符,或者将两个模式分成一个用于每个可能的分隔符。(总共六个?)

于 2015-04-09T19:39:39.127 回答
0

我知道这个问题有点老了,但我认为这个问题没有一个很好的解决方案:

两步做

  1. 更改 Mac 字符串以解析为您选择的格式(例如 xx:xx:xx:xx:xx:xx)
  2. 编写一个验证具有上述格式的字符串的方法

例子:

1)

您可以通过调用轻松实现此目的

public static String parseMac(String mac) {
    mac = mac.replaceAll("[:.-]", "");

    String res = "";
    for (int i = 0; i < 6; i++) {
        if (i != 5) {
            res += mac.substring(i * 2, (i + 1) * 2) + ":";
        } else {
            res += mac.substring(i * 2);
        }
    }
    return res;
}

:.- 是将从字符串中删除的字符

2)

public static boolean isMacValid(String mac) {
    Pattern p = Pattern.compile("^([a-fA-F0-9]{2}[:-]){5}[a-fA-F0-9]{2}$");
    Matcher m = p.matcher(mac);
    return m.find();
}

您可以将 Pattern 设为局部类变量以提高代码的效率。

于 2015-05-08T11:49:35.037 回答
0

MAC 地址可以是 6 或 20 字节(infiniband)

假设分隔符为 : 的正确正则表达式是

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

我们匹配 5 次 XX:可选地,我们匹配另外 14 次 XX:并且我们匹配 XX

于 2019-03-25T13:32:12.617 回答
0

下面的正则表达式模式将有助于管理上面列出的各种模式

"([MACmac]?){1}([:.-]?){1}(([0-9A-Fa-f]{2,3}[:.-]?){4,6})"

最后,我添加了 {4,6},因为下面要求的某些模式期望 3 组 4 次。否则,如果您只寻找通常是 2 个字符组 6 次的默认值,那么您可以使用下面的一个。

"([MACmac]?){1}([:.-]?){1}(([0-9A-Fa-f]{2}[:.-]?){6})"

希望这对所有人都有帮助。

于 2021-01-02T11:37:54.140 回答
0

MAC地址可以使用以下代码进行验证:

private static final String PATTERN = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$";
    
private static boolean validateMAC(String mac) {
        Pattern pattern = Pattern.compile(PATTERN);
        Matcher matcher = pattern.matcher(mac);
        return matcher.matches();
    }
于 2020-06-16T09:19:13.227 回答