2015-05-28 89 views
2

我有一個表示MAC地址的字符串,但如果它爲零,則不會顯示每個地址項的高階字節。也就是說,我不會使用表格00:11:22:33:44:55的地址,而是使用表格0:11:22:33:44:55的地址;而不是形式爲00:1b:17:00:0b:31的地址,它的格式爲0:1b:17:0:b:31正則化MAC地址的Java正則表達式

我想將缺少MAC地址的高位字節(如果該高位字節爲零)的字符串轉換爲明確包含其高位字節的字符串。很顯然,我可以將輸入的字符串拆分爲:,然後遍歷每個元素。但是我認爲使用正則表達式(特別是字符串的replaceAll方法)可能會更乾淨/更快。但是,我寫的正則表達式不起作用。作爲示例,

String original = "0:1b:17:0:b:31"; 
String replaced = original.replaceAll("(^|:)([0-9a-f])(:|$)","$10$2$3"); 
System.out.println(replaced); 

打印00:1b:17:00:b:31。本質上,它沒有插入最後一個b的高位字節。我認爲這是因爲我使用的正則表達式具有重疊匹配:如果有兩個或更多項缺少高階,則用於限定一個匹配結束的冒號還必須用於分隔後續匹配的開始字節。

有沒有辦法允許使用Java的正則表達式重疊匹配?或者,是否有一個我沒有想到的可以在此使用的正則表達式?或者我真的必須採取多線方法(例如,字符串分割和迭代,多次使用上述正則表達式,直到結果與輸入相同爲止等等)。

回答

2

試試這個:

String replaced = original.replaceAll("\\b\\w:", "0$0"); 

\b是一個 「單詞邊界」,所以\b\w將匹配單詞字符(信或nu mber)在輸入開始以及冒號後。 $0是(反向引用)整個比賽。沒有嚇人的樣子變通:)


一些測試代碼:

String original = "0:1b:17:0:b:31"; 
String replaced = original.replaceAll("\\b\\w:", "0$0"); 
System.out.println(replaced); 

輸出:

00:1b:17:00:0b:31 
+0

您需要更換'\ B([\ DA-F])(? = :)'with'0 $ 0' – naomik

+1

haha​​ha'不可怕的環視:)' – vks

+0

好吧然後'\ b([\ da-f]):'用'0 $ 0:'然後... – naomik

1

您可以使用:

String replaced = original.replaceAll("\\b(?=[\\da-fA-F]\\b)", "0"); 

RegEx Demo