使用正则表达式,但保留被替换的内容?

时间:2016-05-25 19:32:02

标签: java regex

我需要一个正则表达式来删除某些字符,但保留删除到新字符串中的内容。我希望避免使用两个单独的表达式。

实施例, 假设我想从字符串中删除所有数字但保留它们并将它们放在不同的字符串中。 " a1b23c"会成为" abc"和#34; 123"

的新字符串

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用Matcher.appendReplacement()Matcher.appendTail()执行使用查找/替换循环描述的内容。以你的例子:

Matcher matcher = Pattern.compile("\\d+").matcher("a1b23c");
StringBuffer nonDigits = new StringBuffer();
StringBuffer digits = new StringBuffer();

while (matcher.find()) {
    digits.append(matcher.group());
    matcher.appendReplacement(nonDigits, "");
}
matcher.appendTail(nonDigits);

System.out.println(nonDigits);
System.out.println(digits);

输出:

abc
123

这种方法必须使用StringBuffer代替StringBuilder,因为这是Matcher支持的内容。

答案 1 :(得分:0)

如果你正在做一些简单的事情,比如移除数字,那么使用一对StringBuilder会更容易:

StringBuilder digits = new StringBuilder();
StringBuilder nonDigits = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
  char ch = str.charAt(i);
  if (Character.isDigit(ch) {
    digits.append(ch);
  } else {
    nonDigits.append(ch);
  }
}
System.out.println(nonDigits);
System.out.println(digits);