用于规范化MAC地址的Java正则表达式

时间:2015-05-28 07:08:52

标签: java regex

我有一个表示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地址的高位字节(如果该高位字节为零)的字符串转换为明确包含其高位字节的字符串。显然,我可以在:上拆分传入的字符串,然后遍历每个元素。但我认为使用正则表达式(特别是字符串的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的正则表达式重叠匹配?或者,是否有一个我没想到的正则表达式可以在这里使用?或者我真的必须采用多线方法(例如,字符串分割和迭代,多次使用上述正则表达式,直到结果与输入相同,等等。)

3 个答案:

答案 0 :(得分:2)

(?:^|(?<=:))(?=.(?::|$))

您可以使用lookarounds查找位置并插入0。请参阅演示。

https://regex101.com/r/tS1hW2/20

答案 1 :(得分:2)

试试这个:

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

\b是&#34;字边界&#34;,因此\b\w将匹配输入开头和冒号后的字符(字母或数字)。 $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

答案 2 :(得分:1)

您可以使用:

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

RegEx Demo