我有一个表示 MAC 地址的字符串,但如果它为零,则不会显示每个地址项的高位字节。也就是说,我将拥有 0:11:22:33:44 形式的地址,而不是
;它不是 00:11:22:33:44:55
形式的地址: 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 的正则表达式进行重叠匹配?或者,是否有一个我没有想到可以在这里使用的正则表达式?或者我真的必须采取多行方法(例如,字符串分割和迭代,多次使用上述正则表达式,直到结果与输入相同,等等)。
最佳答案
试试这个:
String replaced = original.replaceAll("\\b\\w:", "0$0");
\b
是“单词边界”,因此 \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
关于Java正则表达式来标准化MAC地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30499512/