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

时间:2014-11-07 16:20:49

标签: java regex

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

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

我想要前面提到的输出。

4 个答案:

答案 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]和中间的空格。