hatellla
hatellla

Reputation: 5132

Java String replace

Lets say I have a string "aabbccaa". Now I want to replace occurrences of "aa" in given string by another string. But it should be in following way.

First occurrence of "aa" should be replaced by "1" and next occurrence of "aa" by "2" and so on.

So, the result of the string becomes "1bbcc2".

Upvotes: 1

Views: 217

Answers (4)

sgpalit
sgpalit

Reputation: 2686

You can use replaceFirst() in a for loop where counter is incrementing...

for (int i = 1; string.contains("aa"); i++) {
    string = string.replaceFirst("aa", "" + i);
}

Upvotes: 10

romfret
romfret

Reputation: 391

Here is a solution :

    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;

    }

Output : 1bbcc2bb3bb4

Upvotes: 0

Brett Walker
Brett Walker

Reputation: 3576

It is possible to do using Java functions but using a char array and doing it using a lower level of logic would be faster.

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;
}

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726499

You can do it using the Matcher's appendReplacement method:

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());

This approach lets you avoid creating multiple string objects (demo).

Upvotes: 5

Related Questions