有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
    }

  }
}

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


共 (6) 个答案

  1. # 1 楼答案

    为什么有这么多代码? 以下是如何“规范化”您的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();
    }
    
  2. # 2 楼答案

    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();
        }
    
  3. # 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

    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();
    }
    
  4. # 4 楼答案

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

    要做的两个步骤

    1. 将要解析的Mac字符串更改为您选择的格式(例如xx:xx:xx:xx:xx:xx)
    2. 编写一个方法,用上面的格式验证字符串

    例如:

    (一)

    您可以通过调用

    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;
    }
    

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

    (二)

    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();
    }
    

    Ofc您可以使模式成为本地类变量,以提高代码的效率

  5. # 5 楼答案

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

    假设分隔符为:is,则正确的regexp

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

    我们匹配5次XX:或者我们匹配另外14次XX:并且我们匹配XX

  6. # 6 楼答案

    根据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的内容。如果您想避免这种情况,您可以比我更聪明地使它在每个位置匹配相同的字符,或者只需将两个模式拆分为一个,每个可能的分隔符。(总共六个?)