首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java正则表达式规范MAC地址

Java正则表达式规范MAC地址
EN

Stack Overflow用户
提问于 2015-05-28 07:08:52
回答 3查看 1K关注 0票数 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地址的高阶字节(如果高阶字节为零)的字符串转换为显式包含其高阶字节的字符串。显然,我可以在:上拆分传入的字符串,然后遍历每个元素。但是,我认为使用正则表达式(特别是string的replaceAll方法)可以更干净/更快。但是,我编写的正则表达式不起作用。举个例子

代码语言:javascript
复制
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的正则表达式进行重叠匹配?或者,是否有一个正则表达式,我没有想过,它可以在这里使用?还是我真的需要采取多行方法(例如,字符串拆分和迭代,多次使用上述正则表达式,直到输入结果相同,等等)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-28 07:14:06

试试这个:

代码语言:javascript
复制
String replaced = original.replaceAll("\\b\\w:", "0$0");

\b是一个“单词边界”,因此\b\w将在输入的开头和冒号之后匹配一个单词字符(字母或数字)。$0是整个匹配的(反向引用)。周围没有可怕的表情

一些测试代码:

代码语言:javascript
复制
String original = "0:1b:17:0:b:31";
String replaced = original.replaceAll("\\b\\w:", "0$0");
System.out.println(replaced);

输出:

代码语言:javascript
复制
00:1b:17:00:0b:31
票数 2
EN

Stack Overflow用户

发布于 2015-05-28 07:11:31

代码语言:javascript
复制
(?:^|(?<=:))(?=.(?::|$))

您可以使用lookarounds找到位置并插入0.See演示。

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

票数 2
EN

Stack Overflow用户

发布于 2015-05-28 07:12:49

您可以使用:

代码语言:javascript
复制
String replaced = original.replaceAll("\\b(?=[\\da-fA-F]\\b)", "0");

RegEx演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30499512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档