匹配MAC地址的正確正則表達式是什麼?我google了一下,但大部分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地址:不同的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);
}
}
}
如何喲將二者結合起來的正則表達式中的代碼?
爲什麼不去掉所有非十六進制小寫的所有十六進制然後比較?然後,在 – Patashu
Yup中檢查是否匹配12個十六進制字符(標準化模式),然後檢查它是什麼格式。 – Aquillo