如何在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中仅删除字符串的尾随空格并保留前导空格?的主要内容,如果未能解决你的问题,请参考以下文章