如何在Java中仅删除字符串的尾随空格并保留前导空格?

Posted

技术标签:

【中文标题】如何在Java中仅删除字符串的尾随空格并保留前导空格?【英文标题】:How to remove only trailing spaces of a string in Java and keep leading spaces? 【发布时间】:2013-06-03 04:19:30 【问题描述】:

trim() 函数会同时删除尾随和前导空格,但是,如果我只想删除字符串的尾随空格,我该怎么做呢?

【问题讨论】:

【参考方案1】:

自 JDK 11 起

如果您使用的是 JDK 11 或更高版本,您可能应该使用 stripTrailing()。


早期的 JDK 版本

使用正则表达式\s++$,您可以将所有尾随空格字符(包括空格和制表符)替换为空字符串("")。

final String text = "  foo   ";
System.out.println(text.replaceFirst("\\s++$", ""));

输出

  foo

Online demo.

下面是正则表达式的细分:

\s – 任何空白字符, ++ – 匹配一个或多个前一个令牌(可能);即,匹配一个或多个空白字符。 + 模式在其possessive form ++ 中使用,当模式不匹配时,它会花费更少的时间来检测大小写。 $ – 字符串的结尾。

因此,正则表达式将尽可能多地匹配紧跟在字符串末尾的空格:换句话说,就是尾随空格。

如果您以后需要扩展您的需求,学习正则表达式的投资将变得更有价值。

参考文献

Java regular expression syntax

【讨论】:

@WChargin 感谢您提供正则表达式的细分。我认为应该有更多的人跟随您并改进答案。【参考方案2】:

另一种选择是使用 Apache Commons StringUtils,特别是 StringUtils.stripEnd

String stripped = StringUtils.stripEnd("   my lousy string    "," ");

【讨论】:

对不起,我用的是安卓,所以无法使用 我同意。但是,您应该注意用android 标记您的问题,因为android 不是Java @TimBender 这是我的错,我删除了 android 标签,因为这个问题对我来说似乎是通用的 Java。对不起。 Android 可以毫无疑问地使用它。您应该导入 org.apache.commons.lang3 而不是 org.apache.commons.lang。它适用于 API 19+。【参考方案3】:

我稍微修改了原来的java.lang.String.trim() 方法,它应该可以工作:

  public String trim(String str) 
        int len = str.length();
        int st = 0;

        char[] val = str.toCharArray();

        while ((st < len) && (val[len - 1] <= ' ')) 
            len--;
        
        return str.substring(st, len);
    

测试:

  Test test = new Test();
  String sample = "            Hello World               "; // A String with trailing and leading spaces
  System.out.println(test.trim(sample) + " // No trailing spaces left");

输出:

        Hello World // No trailing spaces left

【讨论】:

【参考方案4】:

截至JDK11,您可以使用stripTrailing:

String result = str.stripTrailing();

【讨论】:

【参考方案5】:

最实用的答案是@Micha's,Ahmad's 与您想要的完全相反,但如果您不想使用不熟悉的工具或查看具体方法,这就是我想出的.

public String trimEnd( String myString ) 

    for ( int i = myString.length() - 1; i >= 0; --i ) 
        if ( myString.charAt(i) == ' ' ) 
            continue;
         else 
            myString = myString.substring( 0, ( i + 1 ) );
            break;
        
    
    return myString;

像这样使用:

public static void main( String[] args ) 

    String s = "    Some text here   ";
    System.out.println( s + "|" );
    s = trimEnd( s );
    System.out.println( s + "|" );

输出:

Some text here   |
Some text here|

【讨论】:

"不允许使用正则表达式" ...为什么? @WChargin:学生。我们被允许使用 C++、C# 和/或 Java,但没有实用程序或任何让您的生活变得轻松的东西。我将对其进行更新以使其更通用。【参考方案6】:

我认为最好的方法:

public static String trimEnd(String source) 
    int pos = source.length() - 1;
    while ((pos >= 0) && Character.isWhitespace(source.charAt(pos))) 
        pos--;
    
    pos++;
    return (pos < source.length()) ? source.substring(0, pos) : source;

这不会分配任何临时对象来完成这项工作,并且比使用正则表达式更快。它还删除了所有空格,而不仅仅是 ' '。

【讨论】:

【参考方案7】:

这是一个非常简短、高效且易于阅读的版本:

public static String trimTrailing(String str) 
    if (str != null) 
        for (int i = str.length() - 1; i >= 0; --i) 
            if (str.charAt(i) != ' ') 
                return str.substring(0, i + 1);
            
        
    
    return str;

如果您想使用更广泛的空白定义,也可以使用 !Character.isWhitespace(str.charAt(i) 来替代 str.charAt(i) != ' '

【讨论】:

【参考方案8】:

Spring 框架提供了一个有用的 org.springframework.util.StringUtils。

trimTrailingWhitespace

【讨论】:

【参考方案9】:

此代码旨在通过使用描述性名称(并避免使用正则表达式)尽可能容易地阅读。

它确实使用 Java 8 的 Optional,因此并不适合所有人。

public static String removeTrailingWhitspace(String string) 
    while (hasWhitespaceLastCharacter(string)) 
        string = removeLastCharacter(string);
    
    return string;


private static boolean hasWhitespaceLastCharacter(String string) 
    return getLastCharacter(string)
            .map(Character::isWhitespace)
            .orElse(false);


private static Optional<Character> getLastCharacter(String string) 
    if (string.isEmpty()) 
        return Optional.empty();
    
    return Optional.of(string.charAt(string.length() - 1));


private static String removeLastCharacter(String string) 
    if (string.isEmpty()) 
        throw new IllegalArgumentException("String must not be empty");
    
    return string.substring(0, string.length() - 1);

【讨论】:

【参考方案10】:

String value="欢迎来到java";

所以我们可以使用

值 = value.trim();

【讨论】:

OP 要求只删除尾随空格。 trim() 返回字符串的副本,省略前导和尾随空格。

以上是关于如何在Java中仅删除字符串的尾随空格并保留前导空格?的主要内容,如果未能解决你的问题,请参考以下文章

如何取回使用 .trim 删除的所有原始前导和尾随空格? [复制]

前导和尾随空格剪切 + 中间空格替换

Javascript从多行字符串中删除前导和尾随空格

如何删除前导和尾随空格?

从字符串值中删除空格(前导和尾随)

将多个空间合并为单个空间;删除尾随/前导空格