【问题标题】:Replace the last occurrence of a string in another string [duplicate]替换另一个字符串中最后一次出现的字符串[重复]
【发布时间】:2014-06-13 02:19:48
【问题描述】:

假设我有一个字符串

string myWord="AAAAA";

我想将“AA”替换为“BB”,但只是最后一次出现,如下所示:

"AAABB"

string.replace()string.replaceFirst() 都不行。 有 string.replaceLast() 吗?而且,如果没有,是否会有一个或者是否有替代方法也可以使用正则表达式?

【问题讨论】:

    标签: java regex string


    【解决方案1】:

    你可以这样做:

    myWord = myWord.replaceAll("AA$","BB");
    

    $ 表示最后。

    【讨论】:

    • $ 表示字符串结束。但是如果最后一次出现没有终止字符串呢?
    • 是正则表达式替换吗?
    • 如果字符串有问号 (?) 则不起作用。例如: StringUtil.replaceLast("ab?c", "b?c", "") 返回 ab?而不是一个
    【解决方案2】:
    String string = "AAAAA";
    String reverse = new StringBuffer(string).reverse().toString();
    reverse = reverse.replaceFirst(...) // you need to reverse needle and replacement string aswell!
    string = new StringBuffer(reverse).reverse().toString();
    

    【讨论】:

    • 只有当要替换的字符串和替换是回文时,这才有效吗?此外,字符串是不可变的,因此您必须对 replaceFirst 做一些事情。
    • 没错,你还需要反转替换字符串。
    • 您仍然需要对reverse.replaceFirst() 调用的结果进行一些处理,例如将其重新分配给reverse
    • (评论来自@Biswajit_86)您需要反转源表达式和目标表达式才能使其工作。因此,如果您想用 CA 替换 ABABAAB 中的 AB,那么您的步骤将是 1. 反转 ABABAAB 2. 将源字符串 AB 反转为 BA 3. 将目标 CA 反转为 AC 4. 现在使用 replacefirst 5. 然后反转目标字符串
    【解决方案3】:

    您可以通过String#subtring 做到这一点

    myWord= myWord.substring(0, myWord.length() - 2) + "BB";
    

    【讨论】:

    • 我认为 OP 想让它更通用。
    【解决方案4】:
    myWord=myWord.replaceAll("AA(?!A)","BB");
    

    【讨论】:

      【解决方案5】:

      查找子字符串最后一次出现的索引。

      String myWord = "AAAAAasdas";
      String toReplace = "AA";
      String replacement = "BBB";
      
      int start = myWord.lastIndexOf(toReplace);
      

      创建一个StringBuilder(如果你愿意,你可以连接字符串)。

      StringBuilder builder = new StringBuilder();
      

      在最后一次出现之前追加部分。

      builder.append(myWord.substring(0, start));
      

      附加您要用作替换的String

      builder.append(replacement);
      

      从原始 `String 中添加最后一次出现之后的部分。

      builder.append(myWord.substring(start + toReplace.length()));
      

      你已经完成了。

      System.out.println(builder);
      

      【讨论】:

        【解决方案6】:

        只需获取最后一个索引,然后将表达式替换为您要替换的内容即可。

        myWord 是原词sayAABDCAADEFsourceWord 是你想要替换的,比如AA targetWord 就是你想用 BB 替换它的东西。

        StringBuilder strb=new StringBuilder(myWord);    
        int index=strb.lastIndexOf(sourceWord);    
        strb.replace(index,sourceWord.length()+index,targetWord);    
        return strb.toString();
        

        当您只想用字符串替换字符串时,这很有用。更好的方法是使用模式匹配器并找到最后一个匹配的索引。从该索引中获取子字符串,在那里使用替换函数,然后将其添加回原始字符串。这也将帮助您替换正则表达式

        【讨论】:

          【解决方案7】:

          似乎有一个正则表达式的答案。

          我最初试图通过正则表达式解决这个问题,但无法解决像“AAAzzA”这样的情况。

          所以我在下面想出了这个答案,它可以同时处理“AAAAA”和“AAAzzA”。这可能不是最佳答案,但我想它有效。

          基本思想是找到“AA”出现的最后一个索引,并通过该索引拆分字符串:

          String myWord = "AAAAAzzA";
          String source = "AA";
          String target = "BB";
          int lastIndex = -1;
          if ((lastIndex = myWord.lastIndexOf(source)) >= 0) {
              String f = myWord.substring(0, lastIndex);
              String b = myWord.substring(lastIndex + target.length() >= myWord
                      .length() ? myWord.length() : lastIndex + target.length(),
                      myWord.length());
              myWord = f + target + b;
          }
          System.out.println(myWord);
          

          【讨论】:

            猜你喜欢
            • 2013-05-15
            • 2022-01-13
            • 2011-04-19
            • 2014-03-04
            • 1970-01-01
            • 2011-07-26
            • 2012-12-01
            相关资源
            最近更新 更多