我在字符串中有一个子字符串,格式如下:
ID Number: 4D:9B:C4
我正在使用以下正则表达式来匹配它:
ID Number: [A-Z0-9]{2}(:[A-Z0-9]{2}){2}
我想要做的是捕获匹配此正则表达式(或只是第一个实例)的子串的实例,然后捕获内部的ID号本身,最后用空格替换ID号中的冒号,因此输出将为:< / p>
4D 9B C4
我一直在玩替换所有的捕获组,围绕我想要的括号中的捕获,就像这样.......
String idNum = idNum.replaceAll("ID Number: ([A-Z0-9]{2}(:[A-Z0-9]{2}){2})", "$1");
但是我不确定从这里开始,或者即使我采取了正确的方法。任何建议都将不胜感激。
编辑:也许我没有在描述中用最好的方式来表达这一点,所以我将举例说明。我正在捕获的初始字符串是一个较大的字符串中的子字符串,如...
We got some text up here
ID Number: 4D:9B:C4
And also some text down here
我想要前面提到的输出。
答案 0 :(得分:3)
通过正则表达式和正则表达式。锚\G
匹配上一场比赛结束的位置。
String s = "ID Number: 4D:9B:C4";
System.out.println(s.replaceAll("(?:ID Number: ([A-Z0-9]{2})|(?<!^)\\G):?([A-Z0-9]{2})","$1 $2"));
<强>输出:强>
4D 9B C4
另一个有许多冒号分隔部分的例子。
String s = "ID Number: 4D:9B:C4:B5:C6:D7:F8:K9";
System.out.println(s.replaceAll("(?:ID Number: ([A-Z0-9]{2})|(?<!^)\\G):?([A-Z0-9]{2})","$1 $2"));
<强>输出:强>
4D 9B C4 B5 C6 D7 F8 K9
<强>参考文献:强>
<强>更新强>
String s = "We got some text up here\n" +
"ID Number: 4D:9B:C4:D4:F4\n" +
"And also some text down here";
System.out.println(s.replaceAll("(?s)(?:ID Number: ([A-Z0-9]{2})|(?<!^)\\G):?([A-Z0-9]{2})|.*?(?=ID Number:)|.+","$1 $2").trim());
答案 1 :(得分:1)
我建议使用捕获组来实际获得您感兴趣的内容。没有理由不重复。
String idNum = idNum.replaceAll(
"ID Number: ([A-Z0-9]{2}):([A-Z0-9]{2}):([A-Z0-9]{2})",
"$1 $2 $3"
);
答案 2 :(得分:0)
您可以使用前瞻。由于您可能不止一次使用此模式,因此将其创建为静态最终变量:
private static final Pattern PATTERN = Pattern.compile(":(?=[A-Z0-9]{2})");
// ...
idNum = PATTERN.matcher(idNum).replaceAll(" ");
答案 3 :(得分:0)
提供String模式不会改变太多,我会选择
String str = "ID Number: 4D:9B:C4"
numbers = str.split(':')[1].split(':')
然后你可能必须.trim()数组'numbers'的元素。
你可以使用连接数字[0-2]和中间的空格。