Java String.replaceFirst()接受一个;从“开始”;论点

Java String.replaceFirst()接受一个;从“开始”;论点,java,regex,string,replace,Java,Regex,String,Replace,我需要替换字符串中的一个单词,看起来像“duh-duh-something-duh”。我只需要替换第二个“duh”,但是第一个和最后一个需要保持不变,所以replace()和replaceFirst()不起作用。有没有像replaceFirst(stringregex、stringreplacement、intoffset)这样的方法可以替换从offset开始的第一次替换,或者您可以推荐其他解决方法? 谢谢 像这样的东西行吗 System.out.println( "1 duh 2

我需要替换字符串中的一个单词,看起来像“duh-duh-something-duh”。我只需要替换第二个“duh”,但是第一个和最后一个需要保持不变,所以replace()和replaceFirst()不起作用。有没有像replaceFirst(stringregex、stringreplacement、intoffset)这样的方法可以替换从offset开始的第一次替换,或者您可以推荐其他解决方法?
谢谢

像这样的东西行吗

  System.out.println(
     "1 duh 2 duh duh 3 duh"
     .replaceFirst("(duh.*?)duh", "$1bleh")
  ); // prints "1 duh 2 bleh duh 3 duh"
如果您只想替换字符串中模式的第二个匹配项,那么实际上不需要这种“从开始”索引计算

作为奖励,如果您想每隔一次替换一次
duh
(即第二次、第四次、第六次等),则只需调用
replaceAll
,而不是
replaceFirst

,使用以下替代方法:


像这样的东西怎么样:

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

只有一行代码。。。不是一个完整的方法。

replaceAll不会替换所有其他DUH,因为它不会每次都从一开始就重新启动。就像我说的那样,它实际上会给你一个很好的答案,它会每隔一个
duh
替换一个!“每隔一天就有果酱;你知道,今天不是别的日子。”呵呵。我将“每隔一个duh”解释为“所有其他duh”,而不是“备用duh”,为了清楚起见,让我重新表述一下,在我的解决方案中,
replaceAll
将替换第二、第四、第六个。。。模式的出现。
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);