替换一个字符串在另一个字符串中最后一次出现的位置

20

假设我有一个字符串

string myWord="AAAAA";

我想将“AA”替换为“BB”,但只替换最后一次出现,就像这样:

"AAABB"

string.replace()string.replaceFirst()均无法完成此任务。 是否存在string.replaceLast()?如果不存在,那么是否会有这样一个函数或者是否存在其他可以使用正则表达式的替代方法呢?

7个回答

35

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

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);
在原始的字符串中找到最后一次出现的部分,并将其后面的内容添加上去。
builder.append(myWord.substring(start + toReplace.length()));

完成了。

System.out.println(builder);

33
你可以这样做:
myWord = myWord.replaceAll("AA$","BB");

$ 表示最后。


39
$ 表示字符串的结尾。但是如果最后一次出现并没有终止字符串会怎样? - Sotirios Delimanolis
这是正则表达式替换吗? - Lei Yang
如果字符串中有问号(?),它就无法正常工作。例如:StringUtil.replaceLast("ab?c", "b?c", "") 返回的是 ab? 而不是 a。 - keeping_it_simple

5
只需获取最后一个索引并使用要替换的内容进行就地替换即可。 myWord 是原始单词,比如说 AABDCAADEFsourceWord 是要替换的内容,比如说 AA,而 targetWord 则是你想要替换成的内容,比如说 BB
StringBuilder strb=new StringBuilder(myWord);    
int index=strb.lastIndexOf(sourceWord);    
strb.replace(index,sourceWord.length()+index,targetWord);    
return strb.toString();

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


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

3
如果要替换的字符串和替换内容不是回文,这个方法还能用吗?另外,字符串是不可变的,所以你需要对 replaceFirst 进行一些操作。 - Sotirios Delimanolis
1
是的,您需要反转替换字符串。 - Flash Thunder
你仍然需要对reverse.replaceFirst()调用的结果进行操作,例如将其重新赋值给reverse - Sotirios Delimanolis
(评论来自@Biswajit_86)您需要反转源表达式和目标表达式才能使其正常工作。因此,如果您想用CA替换ABABAAB中的AB,则步骤如下:1.反转ABABAAB 2.反转源字符串AB为BA 3.反转目标CA为AC 4.现在使用replacefirst 5.然后反转目标字符串 - cf-
丑陋,但是能用“我 FROM 想要 FROM 这个”String originalString = "我 FROM 想要 FROM 这个"; String stringReverse = String.valueOf(new StringBuffer(originalString).reverse()).replaceFirst("MORF","OT"); originalString= String.valueOf(new StringBuffer(stringReverse ).reverse()); System.out.println(originalString);“我 FROM 想要 TO 这个” - Joviano Dias

1

看起来这个问题可能有一个正则表达式的答案。

我最初尝试使用正则表达式解决这个问题,但无法解决像 '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);

-2
myWord=myWord.replaceAll("AA(?!A)","BB");

-3
你可以使用 String#subtring 来实现这个功能。
myWord= myWord.substring(0, myWord.length() - 2) + "BB";

3
我认为OP想要使它更加通用。 - Flash Thunder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接