有没有一种快速的方法可以用从匹配模式派生的数据替换所有出现的模式?
例如,如果我想用相同的数字替换字符串中所有出现的数字,并用 0 填充到固定长度。
在这种情况下,如果长度为 4,ab3cd5
则将变为ab0003cd0005
。
我的想法是使用 StringBuilder 和 2 种模式:一种会获取所有数字,另一种会获取非数字的所有内容,并通过找到匹配项的索引将匹配项附加到构建器。
我认为可能有更简单的东西。
有没有一种快速的方法可以用从匹配模式派生的数据替换所有出现的模式?
例如,如果我想用相同的数字替换字符串中所有出现的数字,并用 0 填充到固定长度。
在这种情况下,如果长度为 4,ab3cd5
则将变为ab0003cd0005
。
我的想法是使用 StringBuilder 和 2 种模式:一种会获取所有数字,另一种会获取非数字的所有内容,并通过找到匹配项的索引将匹配项附加到构建器。
我认为可能有更简单的东西。
appendReplacement
使用and之后,您可能可以实现您的目标appendTail
,如下所示:
导入 java.util.regex.Pattern;导入 java.util.regex.Matcher;
String REGEX = "(\\d+)";
String INPUT = "abc3def45";
NumberFormat formatter = new DecimalFormat("0000");
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,formatter.format(Integer.parseInt(m.group(1))));
}
m.appendTail(sb);
String result = sb.toString();
如果您确切知道要在任何单个数字之前填充多少个零,那么这样的事情应该可以工作:
String text = "ab3cd5";
text = text.replaceAll("\\d","0000$0");
System.out.println(text);
否则:
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
StringBuffer result = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(result, String.format("%04d", Integer.parseInt(matcher.group())));
}
matcher.appendTail(result);
System.out.println(result);
格式%04d
表示:一个整数,由零填充,长度为 4。