在Java中去除字符串末尾的空格

11

可能是重复问题:
如何从Java字符串中删除前导和尾随空格

在将数据导入应用程序时,我需要去除某些字符串末尾的空格,但不能去除开头的空格,因此不能使用trim()... 我已经写了一个方法:

public static String quitarEspaciosFinal(String cadena) {
    String[] trozos = cadena.split(" ");
    String ultimoTrozo = trozos[trozos.length-1];
    return cadena.substring(0,cadena.lastIndexOf(ultimoTrozo.charAt(ultimoTrozo.length()-1))+1);
    }

假设有一个字符串 cadena 需要转换...

如果 cadena = " 1234 ",该方法将返回 " 1234"...

我想知道是否有更有效的方法来实现这一点...


这个字符串是一个单词还是可以是一个句子? - oopsi
@oopsi:实际上无关紧要 ^^ - m0skit0
5个回答

30

您可以在字符串上使用replaceAll()方法,使用正则表达式\s+$

return cadena.replaceAll("\\s+$", "");

如果您只想删除实际空格(而不是制表符或换行符),请在正则表达式中用空格替换\\s


3
我会使用加号而不是星号。将0个空格替换为另一个0个空格没有意义 ;) - m0skit0
在这里,replaceFirst 也可以达到相同的目的。 - Marko Topolnik
@MarkoTopolnik:replaceFirst()?OP想要的是replaceLast()。 - m0skit0
@m0skit0 那个正则表达式显然只能有一个匹配。replaceLast甚至不是String的方法。 - Marko Topolnik
我知道它不存在,那只是一个玩笑。无论如何,重点是replaceFirst()在这里没有用处。 - m0skit0

10
    String s = "   this has spaces at the beginning and at the end      ";
    String result = s.replaceAll("\\s+$", "");

9

2
第二个链接已经失效。 - Nactus

6
 public static String replaceAtTheEnd(String input){
    input = input.replaceAll("\\s+$", "");
    return input;
}

1
@m0skit0 :) 刚开始是 +,后来我修改成了 *,不知道为什么 :). 谢谢你。 - Eugene

5
我会这样做:
public static String trimEnd(String s)
{
    if ( s == null || s.length() == 0 )
        return s;
    int i = s.length();
    while ( i > 0 &&  Character.isWhitespace(s.charAt(i - 1)) )
        i--;
    if ( i == s.length() )
        return s;
    else
        return s.substring(0, i);
}

它比使用正则表达式更冗长,但很可能更高效。


我不会对效率问题那么确定(正则表达式可能是用本地代码编写的)。而且重新发明轮子是没有意义的。为什么要手动编写可以通过库已经实现的东西呢?只有当现有的东西不适合你(或者太慢)时,你才能重新发明轮子。稍后再进行优化 ;) 我实际上已经取消了踩的操作 :P - m0skit0
显然,确保效率的唯一方法是针对有意义的数据集进行测试。话虽如此,正则表达式很可能会为其通用性付出代价:例如,正则表达式引擎通常会为了提高效率而转换输入表达式,而我的版本无需执行此步骤。至于外部库,我倾向于同意你的看法,但这仍然是在维护小代码片段和跟踪另一个依赖之间权衡的问题。为什么呢?有时候编写和调试自己的代码比寻找现成的解决方案更省时间! - Nicola Musatti
但是你会浪费时间去编写和测试这个。我的观点是,如果不必要的话,你不需要重新发明轮子。 - m0skit0

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