views:

183

answers:

3

I need to replace a word in a string looking like "duh duh something else duh". I only need to replace the second "duh", but the first and the last ones need to stay untouched, so replace() and replaceFirst() don't work. Is there a method like replaceFirst(String regex, String replacement, int offset) that would replace the first occurrence of replacement starting from offset, or maybe you'd recommend some other way of solving this? Thanks!

+3  A: 

Will something like this work?

  System.out.println(
     "1 duh 2 duh duh 3 duh"
     .replaceFirst("(duh.*?)duh", "$1bleh")
  ); // prints "1 duh 2 bleh duh 3 duh"

If you just want to replace the second occurrence of a pattern in a string, you really don't need this "starting from" index calculation.

As a bonus, if you want to replace every other duh (i.e. second, fourth, sixth, etc), then just invoke replaceAll instead of replaceFirst.

polygenelubricants
replaceAll will not replace all the other duhs, since it does not restart from the beginning every time. It will actually give 1duh2blehduh3bleh
Matthew Flaschen
Which is replacing every other `duh` like I said!
polygenelubricants
"It's jam every other day; to-day isn't any other day, you know."
Michael Brewer-Davis
Heh. I interpreted "every other duh" as "all the other duhs", rather than "alternate duhs"
Matthew Flaschen
For the sake clarity, let me rephrase by saying that `replaceAll` in my solution would replace the 2nd, 4th, 6th, ... occurrence of the pattern.
polygenelubricants
Guys, this is way cool, but my case is a bit different. In the end I need to replace let's say, all duh's with else's, and then all else's with whatever, but not the else's that used to be duh's. So I'm iterating over the string taking one word at a time and replacing it.
Slavko
+2  A: 

An alternative using Matcher:

 String input = "duh duh something else duh";
 Pattern p = Pattern.compile("duh");
 Matcher m = p.matcher(input);
 int startIndex = 4;

 String output;

 if (m.find(startIndex)) {
     StringBuffer sb = new StringBuffer();
     m.appendReplacement(sb, "dog");
     m.appendTail(sb);
     output = sb.toString();
 } else {
     output = input;
 }
Michael Brewer-Davis
+3  A: 

What about something like this:

String replaceFirstFrom(String str, int from, String regex, String replacement)
{
    String prefix = str.substring(0, from);
    String rest = str.substring(from);
    rest = rest.replaceFirst(regex, replacement);
    return prefix+rest;
}
Chinmay Kanchi
Ok, this is exactly what I needed, thank you!
Slavko