【问题标题】:Java String.replaceFirst() that takes a "starting from" argumentJava String.replaceFirst() 接受“开始于”参数
【发布时间】:2011-01-20 17:41:52
【问题描述】:

我需要替换字符串中的一个单词,看起来像“duh duh something else duh”。我只需要替换第二个“duh”,但第一个和最后一个需要保持不变,所以 replace() 和 replaceFirst() 不起作用。是否有像 replaceFirst(String regex, String replacement, int offset) 这样的方法可以替换从偏移量开始的第一次替换,或者您可能会推荐其他解决此问题的方法? 谢谢!

【问题讨论】:

    标签: java regex string replace


    【解决方案1】:

    这样的事情怎么样:

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

    只有 1 行代码...不是完整的方法。

    【讨论】:

      【解决方案2】:

      这样的事情会起作用吗?

        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

      【讨论】:

      • replaceAll 不会替换所有其他 duhs,因为它不会每次都从头开始重新启动。它实际上会给 1duh2blehduh3bleh
      • 就像我说的那样替换所有其他duh
      • “每隔一天就会发生一次果酱;今天不是其他任何一天,你知道的。”
      • 嘿。我将“其他所有的废话”解释为“所有其他的废话”,而不是“交替的废话”
      • 为了清楚起见,让我换个说法,我的解决方案中的 replaceAll 将替换模式的第 2、4、6、... 次出现。
      【解决方案3】:

      使用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;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        • 2021-12-27
        相关资源
        最近更新 更多