Java 替换另一个字符串中最后出现的字符串

Java 替换另一个字符串中最后出现的字符串,java,regex,string,Java,Regex,String,假设我有一根绳子 string myWord="AAAAA"; 我想用“BB”替换“AA”,但仅是最后一次出现,如下所示: "AAABB" string.replace()和string.replaceFirst()都不能完成此任务。 是否有字符串.replaceLast()?如果没有,是否会有一个或有其他方法也使用正则表达式?您可以这样做: myWord = myWord.replaceAll("AA$","BB"); $表示最后一次。您可以使用字符串#子字符串 String strin

假设我有一根绳子

string myWord="AAAAA";
我想用“BB”替换“AA”,但仅是最后一次出现,如下所示:

"AAABB"
string.replace()和string.replaceFirst()都不能完成此任务。 是否有字符串.replaceLast()?如果没有,是否会有一个或有其他方法也使用正则表达式?

您可以这样做:

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

$
表示最后一次。

您可以使用
字符串#子字符串

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();
myWord= myWord.substring(0, myWord.length() - 2) + "BB";

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

String myWord = "AAAAAasdas";
String toReplace = "AA";
String replacement = "BBB";

int start = myWord.lastIndexOf(toReplace);
创建一个
StringBuilder
(如果需要,您可以连接字符串)

在最后一个引用之前追加零件

builder.append(myWord.substring(0, start));
附加要用作替换的
字符串

builder.append(replacement);
在原始`字符串的最后一个引用之后追加该部分

builder.append(myWord.substring(start + toReplace.length()));
你完成了

System.out.println(builder);

只需获取最后一个索引,并使用要替换的内容替换表达式

myWord
是原始单词say
AABDCAADEF
sourceWord
是您要替换的,比如说
AA
targetWord
是您想要用say
BB
替换它的内容

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

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

似乎有一个正则表达式可以解决这个问题

我最初试图通过正则表达式解决这个问题,但无法解决“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);

$表示字符串的结尾。但如果最后一次出现没有终止字符串呢?它是regex replace吗?如果字符串有问号(?),它就不起作用。例如:StringUtil.replaceLast(“ab?c”,“b?c”,“”)返回ab?我认为OP想让它更通用,而不是aI。如果要替换的字符串和替换的字符串都是回文,这难道不管用吗?此外,字符串是不可变的,因此您必须对
replaceFirst
执行某些操作。确实,您还需要反转替换字符串。您仍然需要对
reverse.replaceFirst()
调用的结果执行某些操作,例如将其重新分配给
reverse
(注释来自@Biswajit\u 86)您需要反转源表达式和目标表达式才能使其工作。所以,如果你想用CA替换ABABAB中的AB,那么你的步骤应该是1。倒转ababab 2。将源字符串AB反转为BA 3。将目标CA反转为AC 4。现在使用前5个。然后反转目标字符串
StringBuilder strb=new StringBuilder(myWord);    
int index=strb.lastIndexOf(sourceWord);    
strb.replace(index,sourceWord.length()+index,targetWord);    
return strb.toString();
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);