首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同的MAC地址Regex

不同的MAC地址Regex
EN

Stack Overflow用户
提问于 2013-05-30 14:34:56
回答 7查看 15K关注 0票数 5

匹配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地址格式如下:

代码语言:javascript
复制
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

直到现在我所拥有的是这样的:

代码语言:javascript
复制
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);
    }

  }
}

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-05-30 14:44:57

为什么会有这么多代码?下面是你如何“标准化”你的mac地址:

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

下面是一种验证它的方法:

代码语言:javascript
复制
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();
}
票数 5
EN

Stack Overflow用户

发布于 2017-02-23 17:05:23

试试这个,效果很好..

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

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2015-04-10 03:39:39

代码语言:javascript
复制
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之类的代码相匹配。如果你想避免这种情况,你可以比我更聪明,让它在每个地方匹配相同的字符,或者只是将两个模式拆分为两个模式,每个可能的分隔符。(总共六个?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16829485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档