String.replaceAll变种

时间:2012-06-10 16:50:06

标签: java

是否有一种快速方法可以将所有模式匹配项替换为从匹配模式派生的数据?

例如,如果我想替换字符串中所有出现的数字,并使用相同的数字替换为固定长度为0。

在这种情况下,如果长度为4,则ab3cd5将变为ab0003cd0005

我的想法是使用StringBuilder和2个模式:一个将获得所有数字,另一个将获得不是数字的所有内容,并通过索引将匹配项添加到构建器中。

我认为可能会有更简单的事情。

2 个答案:

答案 0 :(得分:2)

您可以实现使用appendReplacementappendTail之后的目标,如下所示:

import java.util.regex.Pattern; import 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();

答案 1 :(得分:1)

如果您确切知道在任何单个数字之前要填充多少个零,那么这样的事情应该有效:

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。