1

可以说我有一个字符串"aabbccaa"。现在我想"aa"用另一个字符串替换给定字符串中的出现。但它应该是以下方式。

第一次出现的"aa"应该被替换"1",下一次出现的应该"aa"被替换"2",依此类推。

因此,字符串的结果变为"1bbcc2"

4

4 回答 4

10

您可以replaceFirst()在计数器递增的 for 循环中使用...

for (int i = 1; string.contains("aa"); i++) {
    string = string.replaceFirst("aa", "" + i);
}
于 2015-05-26T13:25:34.853 回答
5

您可以使用Matcher'sappendReplacement方法来做到这一点:

Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aabbccaahhhaahhhaaahahhahaaakty");
StringBuffer sb = new StringBuffer();
// Variable "i" serves as a counter. It gets incremented after each replacement.
int i = 0;
while (m.find()) {
    m.appendReplacement(sb, ""+(i++));
}
m.appendTail(sb);
System.out.println(sb.toString());

这种方法可以让您避免创建多个字符串对象 ( demo )。

于 2015-05-26T13:26:43.320 回答
0

可以使用 Java 函数,但使用 char 数组并使用较低级别的逻辑会更快。

String s = "aabbccaa";
String target = "aa";
int i = 1;
String newS;

for (int j = 0; j < s.length; j++) {
  newS = s.replaceFirst(target, i++);
  j += newS.length - s.length;
  s = newS;
}
于 2015-05-26T13:26:59.870 回答
0

这是一个解决方案:

    public static void main(String[] a) {

        int i = 1;
        String before = "aabbccaabbaabbaa";
        String regex = "aa";

        String after = substitute(i, before, regex);

        System.out.println(after);

    }

    private static String substitute(int i, String before, String regex) {

        String after = before.replaceFirst(regex, Integer.toString(i++));

        while (!before.equals(after)) {

            before = after;
            after = before.replaceFirst(regex, Integer.toString(i++));

        }

        return after;

    }

输出 : 1bbcc2bb3bb4

于 2015-05-26T13:37:00.103 回答