Java 替换匹配正则表达式中的字符

Java 替换匹配正则表达式中的字符,java,regex,Java,Regex,我有一个字符串中的子字符串,格式如下: ID Number: 4D:9B:C4 我使用以下正则表达式来匹配它: ID Number: [A-Z0-9]{2}(:[A-Z0-9]{2}){2} 我要做的是捕获与此正则表达式匹配的子字符串的实例(或只是第一个实例),然后捕获内部的ID号本身,最后用空格替换ID号中的冒号,因此输出将是: 4D 9B C4 我一直在尝试在replace all中使用捕获组,将我想要的捕获放在括号中,就像这样 String idNum = idNum.replace

我有一个字符串中的子字符串,格式如下:

ID Number: 4D:9B:C4
我使用以下正则表达式来匹配它:

ID Number: [A-Z0-9]{2}(:[A-Z0-9]{2}){2}
我要做的是捕获与此正则表达式匹配的子字符串的实例(或只是第一个实例),然后捕获内部的ID号本身,最后用空格替换ID号中的冒号,因此输出将是:

4D 9B C4
我一直在尝试在replace all中使用捕获组,将我想要的捕获放在括号中,就像这样

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

我想要前面提到的输出。

您可以使用前瞻。由于您可能会不止一次地使用此模式,请将其创建为静态最终变量:

private static final Pattern PATTERN = Pattern.compile(":(?=[A-Z0-9]{2})");

// ...

idNum = PATTERN.matcher(idNum).replaceAll(" ");

如果字符串模式没有太多变化,我会选择

String str = "ID Number: 4D:9B:C4"
numbers = str.split(':')[1].split(':')
然后,您可能必须.trim()删除数组“number”中的元素


之后,您可以将数字[0-2]与中间的空格连接起来。

我建议使用捕获组来实际获取您感兴趣的内容。没有理由不重复

String idNum = idNum.replaceAll(
   "ID Number: ([A-Z0-9]{2}):([A-Z0-9]{2}):([A-Z0-9]{2})",
   "$1 $2 $3"
);

通过regex和regex-ony。锚点
\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"));
另一个例子是许多冒号分隔的部分

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
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());
更新:

4D 9B C4
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());
String s=“我们这里有一些文本\n”+
“ID号:4D:9B:C4:D4:F4\n”+
“下面还有一些文字”;

System.out.println(s.replaceAll(“(?s)(?:ID号:([A-Z0-9]{2})|(?try
idNum.replaceAll(“ID号:|:”,“”))trim()
这将返回
4D 9B C4
非常感谢您的精彩回答。请您查看我上面的编辑,并修改或扩展您的答案,以符合我问题的确切性质?它似乎只会影响正在讨论的一行,而仍然输出其他行。我的输出就像……我们这里有一些文本4D 9B C4还有下面的一些文本,我似乎不能在注释中使用硬返回或奇特的格式,但是想象一下,在我在前面的注释中所述的输出中,“here4d”和“C4”之间的空格“实际上是硬返回。请注意,我的代码副本中有一个错误。但我的输出中仍有一个前导空格。如何删除它?使用修剪函数删除前导空格。”。