Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于规范化MAC地址的Java正则表达式_Java_Regex - Fatal编程技术网

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

用于规范化MAC地址的Java正则表达式,java,regex,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地址高阶字节(如果该高阶字节为零)的字符串转换为显式包含其高阶字节的字符串。显然,我可以在:上拆分传入字符串,然后遍历每个元素。但我认为使用正则表达式(特别是string的方法)可能更干净/更快。但是,我编写的正则表达

我有一个表示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地址高阶字节(如果该高阶字节为零)的字符串转换为显式包含其高阶字节的字符串。显然,我可以在
上拆分传入字符串,然后遍历每个元素。但我认为使用正则表达式(特别是string的方法)可能更干净/更快。但是,我编写的正则表达式不起作用。例如,

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(?=[\\da-fA-F]\\b)", "0");
试试这个:

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

您需要替换
\b([\da-f])(?=:)
0$0
@naomik感谢您指出这一点,但解决方案实际上比这更简单。请参阅edit@vks,我的观点是,
\d
不会匹配所有十六进制chars@anubhava
\d
匹配所有十六进制字符?@naomik no
\d
匹配任何数字。我已将其更改为
\w
-任何字母或数字(或下划线),在mac地址的上下文中就足够了
00:1b:17:00:0b:31