如何从字符串中删除最后一个字符?

597

我想从字符串中删除最后一个字符。我尝试了以下方法:

public String method(String str) {
    if (str.charAt(str.length()-1)=='x'){
        str = str.replace(str.substring(str.length()-1), "");
        return str;
    } else{
        return str;
    }
}

获取字符串长度-1并将最后一个字母替换为空(删除它),但每次运行程序时,它会删除与最后一个字母相同的中间字母。

例如,单词是“admirer”;运行该方法后,我得到“admie”。我希望它返回单词admire。

37个回答

799
< p > replace 会替换所有字母的实例。您只需要使用 substring() 即可:

public String method(String str) {
    if (str != null && str.length() > 0 && str.charAt(str.length() - 1) == 'x') {
        str = str.substring(0, str.length() - 1);
    }
    return str;
}

10
我会在检查的开头添加 null != str && - James Oravec
15
你的意思是 str != null && - SSpoke
3
@SSpoke说的没错,这两个意思是一样的,你的只是更易读一些 :) - Marko
6
@Marko 哈哈,是的,因为这是标准,当人们自己编造时感觉很奇怪。 - SSpoke
35
在C语言中,你可能会意外地写出if (str = NULL)这样的代码,它不仅总是评估为false(NULL == 0 == false),而且还会给str赋值,这很可能不是你想要做的。然而,你不能写成if (NULL = str),因为NULL不是一个变量,无法被赋值。因此,在C语言中,将NULL放在左侧是一种更安全的约定。但在Java中,这并不是问题。 - Gyan aka Gary Buyn
显示剩余10条评论

279

为什么不只用一行代码呢?

public static String removeLastChar(String str) {
    return removeChars(str, 1);
}

public static String removeChars(String str, int numberOfCharactersToRemove) {
    if(str != null && !str.trim().isEmpty()) {
        return str.substring(0, str.length() - numberOfCharactersToRemove);
    }
    return "";
}

完整代码

public class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s1 = "Remove Last CharacterY";
        String s2 = "Remove Last Character2";
        String s3 = "N";
        String s4 = null;
        String s5 = "";
        System.out.println("After removing s1==" + removeLastChar(s1) + "==");
        System.out.println("After removing s2==" + removeLastChar(s2) + "==");
        System.out.println("After removing s3==" + removeLastChar(s3) + "==");
        System.out.println("After removing s4==" + removeLastChar(s4) + "==");
        System.out.println("After removing s5==" + removeLastChar(s5) + "==");
        }
    
    public static String removeLastChar(String str) {
        return removeChars(str, 1);
    }

    public static String removeChars(String str, int numberOfCharactersToRemove) {
        if(str != null && !str.trim().isEmpty()) {
            return str.substring(0, str.length() - numberOfCharactersToRemove);
        }
        return "";
    }
}

演示


10
检查 null 和空字符串应该被考虑。@BobBobBob 的版本更好。 - KDjava
1
@KDjava:以上代码是在假设传递的字符串是有效的情况下才有效。否则,我还需要添加try catch块来检查字符串是否正确... - Fahim Parkar
我在改进中添加了对空字符串的检查,以防止在 return str.substring(0,str.length()-1); 之前出现空指针异常。 - shareef
谢谢,此源代码正在 https://gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730 使用。 - CrandellWS
@FahimParkar:因为最后一个字符可能不是我们想要删除的字符。但根据问题,你的答案是正确的。 - Ash18

114

既然我们在谈论这个主题,那么也可以使用正则表达式。

"aaabcd".replaceFirst(".$",""); //=> aaabc  

3
好的,我会尽力进行翻译。以下是需要翻译的内容:nice way, when you want/need to define exactly what you want to trim from the end of the string, not just X whatever chars翻译:在你想要/需要精确定义要从字符串末尾删除什么内容时,这是一个好的方式,而不仅仅是X个任意字符。 - Julien

99
描述的问题和提出的解决方案有时与删除分隔符有关。如果这是您的情况,请查看Apache Commons StringUtils,它有一个名为removeEnd的方法非常优雅。
例子:
StringUtils.removeEnd("string 1|string 2|string 3|", "|");

会导致以下结果:"字符串1 | 字符串2 | 字符串3"

这是前面提到的 StringUtils 的 JAR 包:https://commons.apache.org/proper/commons-lang/download_lang.cgi - Tony H.

57
public String removeLastChar(String s) {
    if (s == null || s.length() == 0) {
        return s;
    }
    return s.substring(0, s.length()-1);
}

4
如果最后一个字符是高位/低位代理对,会怎样? - Robert Allan Hennigan Leahy
@RobertAllanHenniganLeahy 我发布了一个答案,可以处理这种情况。 - Patrick Parker

41

2
如果您只想删除最后一个字符 - 这是最佳答案! - iaforek
不是的,因为“使用Java”是对Kotlin问题的可怕回答。 - Mikkel Løkke
5
我不知道,但无论如何这个问题都不是关于Kotlin的问题。 - membersound

39

Kotlin中,您可以使用字符串类的dropLast()方法。它将从字符串中删除给定数量,并返回一个新字符串。

var string1 = "Some Text"
string1 = string1.dropLast(1)

28

使用这个:

 if(string.endsWith("x")) {

    string= string.substring(0, string.length() - 1);
 }

11
if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

例如,单词是“admirer”;运行该方法后,我得到“admie”。我想让它返回单词“admire”。

如果您正在尝试对英语单词进行词干处理

词干提取是将屈折(或有时派生)单词缩减为其词干、基础或根形式的过程——通常是书面单词形式。

...

例如,英语的词干提取器应该将字符串“cats”(可能还包括“catlike”,“catty”等)识别为以“cat”为根的单词,并将“stemmer”,“stemming”,“stemmed”识别为以“stem”为基础。一个词干算法将“fishing”,“fished”,“fish”和“fisher”这些词汇缩减为根词“fish”。

Lucene词干提取器之间的区别:EnglishStemmer、PorterStemmer、LovinsStemmer概述了一些Java选项。


11

就可读性而言,我认为这是最简洁的。

StringUtils.substring("string", 0, -1);

在Apache的StringUtils实用程序中可以使用负索引。 所有负数都被视为从字符串末尾的偏移量。


1
我不会说这是最好的答案 - 为了简单起见,使用org.apache.commons.lang.StringUtils.chop()方法。然而,使用-1的技巧确实很棒,看看其他答案并不是真正被使用或广为人知的。 - iaforek

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