开发者

Java String.replaceFirst() that takes a "starting from" argument

开发者 https://www.devze.com 2022-12-21 16:46 出处:网络
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 re

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(开发者_StackOverflow社区) 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!


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.


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.


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

精彩评论

暂无评论...
验证码 换一张
取 消