替换字符串的最后一部分

56
我想把最后一个字符串,替换为)
假设字符串是:

Insert into dual (name,date,

它需要转换为:

Insert into dual (name,date)


3
你考虑过重写循环以便正确显示逗号的数量吗?我看到了一个 Stackoverflow 的问题,是为了让这个循环尽可能高效地实现。 - Thorbjørn Ravn Andersen
1
只需使用以下代码:"Insert into dual (name,date,".replaceAll(",(?!.*,)",")"); - dragon66
11个回答

86
以下代码应该替换最后一个逗号(',')为一个右括号(')')。
StringBuilder b = new StringBuilder(yourString);
b.replace(yourString.lastIndexOf(","), yourString.lastIndexOf(",") + 1, ")" );
yourString = b.toString();

注意 如果String中不包含',',则会抛出异常。


13
两种语言都有StringBuilder。 - jjnguy
10倍,没想到。我认为你的解决方案将替换任何最后一个逗号,而不仅仅是在字符串末尾。 - Dani
2
Dani:StringBuilder是Java中非线程安全的StringBuffer变体,它比后者更快(如果我没记错的话,大约快20-30%),如果不需要显式地使用线程安全的StringBuffer,则应该优先选择StringBuilder。 - Esko
1
呵呵...太棒了。一开始我还以为那是C#呢。实际上唯一的区别就是方法名的大小写而已。 - mpen
使用正则表达式更快。 - hephestos
显示剩余3条评论

41

您可以使用正则表达式:

String aResult = "Insert into dual (name,date,".replaceAll(",$", ")");

replaceAll(...)函数会使用给定的正则表达式(参数1)匹配字符串(在本例中,如果最后一个字符是逗号,则匹配它)。然后用替换文本(参数2)替换它(在本例中是')')。

另外!如果你想确保处理尾随空格和制表符,只需将正则表达式更改为',\[ \t\]*$'。注意:'\['和'\]'没有反斜杠(我不知道如何正确转义它)。


3
如果你使用replaceAll(",$", ")") 替换为 replaceAll("[,]*$", ")"),它将起作用,即使有几个逗号。例如:" (name, date,,," --> " (name, date)"。我认为这种方法更加灵活。 - csonuryilmaz

20

这是一个自定义方法,用于替换给定字符串中仅最后一个子字符串。这对您很有用:

private String replaceLast(String string, String from, String to) {
    int lastIndex = string.lastIndexOf(from);
    if (lastIndex < 0)
        return string;
    String tail = string.substring(lastIndex).replaceFirst(from, to);
    return string.substring(0, lastIndex) + tail;
}

9
str = str.substring(0, str.lastIndexOf(",")) + ")";

1
这将更改最后一个“,”,无论它是否是字符串中的最后一个字符。 - ty812
它可以在任何逗号所在的位置工作 - 但它会忽略最后一个逗号之后的任何内容。 - sfussenegger
1
如果lastIndexOf返回-1substring将抛出一个异常。 - ADTC

9

2
更易读的方式是使用代码注释。你可以使用它来了解字符串及其函数。
String myString = "Insert into dual (name,date,";
String newString = "";
int length = myString.length();
String lastChar = myString.substring(length-1);

if (lastChar.contains(",")) {
    newString = myString.substring(0,length-1) + ")";
}

System.out.println(newString);

1

在类似的搜索中,我找到了这个答案:

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

我认为这是最好的选择,因为它使用Java方法来实现,而不是试图重新发明轮子。

它基本上是从后往前读取字符串,并使用String对象的replaceFirst方法,这正是我所需要的。

这里是replaceFirst String方法和StringBuffer的reverse函数的文档:

replaceFirst

reverse

这是我如何将其实现为简单删除我想要解释的代码片段中的一些HTML“pre”标记。请记住,也要反转搜索字符串,然后将所有内容恢复正常。

private String stripHtmlPreTagsFromCodeSnippet(String snippet) {
    String halfCleanSnippet = snippet.replaceFirst("<pre>", "");
    String reverseSnippet = new StringBuffer(halfCleanSnippet).reverse().toString();
    String reverseSearch = new StringBuffer("</pre>").reverse().toString();
    String reverseCleanSnippet = reverseSnippet.replaceFirst(reverseSearch, "");
    return new StringBuffer(reverseCleanSnippet).reverse().toString();
}

1

检查字符串的长度,检查最后一个字符(如果您知道长度,这很容易),并在必要时进行替换。

这个解决方案不是特定于某种编程语言的 - 只需运用常识即可。


不是最后一个字符,而是特定字符的最后一次出现。 - jjnguy
嗯,这个问题并不清楚。 “最后一个字符串..” 我想知道他的意思是什么... - Dani
没错,这就是为什么我选择了适用于两种情况的方法。 - jjnguy

0

将您的字符串的最后一个字符替换为)

str = str.substring(0, str.length()-1)+")";

确保您的字符串不为空或null。


0

尝试使用这个正则表达式 (^.+)b(.+$)

示例(替换最后一个b字符)

System.out.println("1abchhhabcjjjabc".replaceFirst("(^.+)b(.+$)", "$1$2"));

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