【发布时间】:2019-11-22 19:30:08
【问题描述】:
我有这台服务器,它记录了对 MAC 地址的观察。当客户端想要查看给定 MAC 地址的观察结果时,他可以使用完整 MAC 或分段 MAC 发出该请求。有效请求可以是由 8 位倍数组成的 MAC 地址的开头或结尾,示例如下:
- FF: - MAC 地址的前 8 位
- FF:AA: - MAC 地址的前 16 位
- :FF - MAC 地址的最后 8 位
- :AA:FF - MAC 地址的最后 16 位
- :AA:BB:CC:DD:FF - 没有前 8 位的 MAC 地址的结尾。
- AA:BB:CC:DD:EE:FF - 完整的 MAC 地址
这些示例不允许:
- FF - 必须以“:”结束或以让服务器知道它是一个初始片段
- FF:AA - 必须以“:”结束或以让服务器知道它是一个初始片段
- :FF: - 不允许中间片段
- OO:JJ - 不允许使用非十六进制字符。
这是我的代码:
private static boolean isMAC(String mac) {
String[] fragMACs = mac.split(":");
if (fragMACs.length > 0 && fragMACs.length <= 6) {
for (String s : fragMACs) {
if (s.length() != 2) {
return false;
} else {
try {
Long.parseLong(s, 16);
} catch (NumberFormatException nfe) {
return false;
}
}
}
return true;
}
return false;
}
目前我的功能不适用于以下情况:
- 任何以“:”开头的片段,分割功能都会搞砸。
- 它不包含用于确保它不是中间 mac 片段的验证。 (AA, AA:AA, :AA:)
最后的验证很简单,一个简单的if语句如下:
if ((mac.charAt(0) == ':' && mac.charAt(fragMACs.length - 1) == ':')
|| (mac.charAt(0) != ':' && mac.charAt(fragMACs.length - 1) != ':')) {
return false;
}
应该可以解决问题。
我的问题在于那个拆分子句。有没有关于如何有效解决这个问题的建议?
【问题讨论】:
-
你在模式匹配方面遇到了问题 - 对我来说,这叫 REGEX。
-
是的,但只有当输入字符串以':'开头时才会失败,我该如何解决?