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!
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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;
}
// or
s.substring(0,start) + s.substring(start).replaceFirst(search, replace);
just 1 line of code ... not a whole method.
回答2:
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
.
回答3:
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;
}