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
2010-02-24 21:23:07
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
2010-02-24 22:13:10
Which is replacing every other `duh` like I said!
polygenelubricants
2010-02-24 22:14:43
"It's jam every other day; to-day isn't any other day, you know."
Michael Brewer-Davis
2010-02-24 22:18:03
Heh. I interpreted "every other duh" as "all the other duhs", rather than "alternate duhs"
Matthew Flaschen
2010-02-24 22:21:02
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
2010-02-24 22:21:36
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
2010-02-24 23:10:59
+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
2010-02-24 21:24:39
+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
2010-02-24 21:42:57