1

mac 地址字符串可能采用以下格式:

00:aa:bb:cc:dd:ee

或者

00aabbccddee

我需要一个好方法来检索这 6 个部分。

这是我的代码:

public class Mac
{
    public static void main(String[] args)
    {
        String mac = "00:aa:bb:cc:dd:ee"; /* 00aabbccddee */
        Scanner s = new Scanner(mac);
        s.useDelimiter(":?"); /* zero or one occurrence */                                                                                                                             
        String t = null;
        while ((t = s.next("[0-9a-f][0-9a-f]")) != null)
            System.out.println(t);
    }
}

它抛出一个异常:

Exception in thread "main" java.util.InputMismatchException
        at java.util.Scanner.throwFor(Scanner.java:840)
        at java.util.Scanner.next(Scanner.java:1461)
        at java.util.Scanner.next(Scanner.java:1394)
        at Mac.main(Mac.java:11)

它出什么问题了?

4

4 回答 4

3
public static String[] getMacAddressParts(String macAddress) {
    String[] parts = macAddress.split(":");
    if (parts.length == 0) {
        parts = new String[6];
        for (int i = 0; i < 6; i++) {
            parts[i] = macAddress.substring(i * 2, i * 2 + 1);
        }
    }
    return parts;
}
于 2012-06-13T04:04:55.353 回答
1
String[] splitMac(String mac) {
    String[] parts = null;
    if (mac.length() == 6*3) {
      parts = mac.split(":");
    } else if (mac.length() == 6*2) {
      parts = new String[6];
      parts[0] = mac.substring(0,1);
      parts[1] = mac.substring(2,3);
      parts[2] = mac.substring(4,5);
      parts[3] = mac.substring(6,7);
      parts[4] = mac.substring(8,9);
      parts[5] = mac.substring(10,11);
    } else {
      throw new RuntimeException("Invalid arg for mac addr: " + mac);
    }
    return parts;
}
于 2012-06-13T03:53:19.073 回答
1

为零次或多次出现设置分隔符会将字符串拆分为 next() 结果中的每个字符,如下所示:

a a b b c c d d e e

因为您是说如果找到或找不到,请拆分它。

因此,寻找与您的正则表达式匹配的下一个标记 "[0-9a-f][0-9a-f]" 会引发该异常,因为它每次都尝试将一个字符与 2 个字符的正则表达式匹配,然后将其抛出您尝试获取的令牌与您提供的正则表达式不匹配,因此在防止这种情况之前执行 hasNext("Pattern") 。

此外,当字符串通过 next() 方法停止读取字符时,您的代码将抛出 NoSuchElementException,验证它是否在 while 条件中具有带有 hasNext("Pattern") 的下一个标记。

所以只需删除 ? 在分隔符上,它将起作用。

例子:

    String mac = "00:aa:bb:cc:dd:ee"; /* 00aabbccddee */
    Scanner s = new Scanner(mac);
    s.useDelimiter(":"); /* zero or one occurrence */                                                                                                                             
    String t = null;
    while (s.hasNext("[0-9a-f][0-9a-f]"))
    {
        t = s.next("[0-9a-f][0-9a-f]");
        System.out.println(t);
    }

问候

于 2012-06-13T04:22:01.243 回答
0
  String mac = "00:aa:bb:cc:dd:ee";

  String[] partsArray = mac.split(":");

  for(int i = 0; partsArray.length < i ;i++){
     String part = partsArray[i];
     System.out.println ("Splitted mac address part "+i+" is - "+part);
  }
于 2012-06-13T03:58:02.013 回答