58

ltrim()什么是 Java 中 JavaScript和rtrim()函数的良好替代品?

4

7 回答 7

62

使用正则表达式,您可以编写:

String s = ...
String ltrim = s.replaceAll("^\\s+","");
String rtrim = s.replaceAll("\\s+$","");

如果您必须经常这样做,您可以创建和编译一个模式以获得更好的性能:

private final static Pattern LTRIM = Pattern.compile("^\\s+");

public static String ltrim(String s) {
    return LTRIM.matcher(s).replaceAll("");
}

从性能的角度来看,一个快速的微型基准测试显示(JIT 编译后)正则表达式方法比循环慢大约 5 倍(100 万个 ltrim 为 0.49 秒对 0.11 秒)。

我个人发现正则表达式方法更具可读性且不易出错,但如果性能是一个问题,您应该使用循环解决方案。

于 2013-03-22T09:40:28.920 回答
34

使用正则表达式可能很好,但它比简单的修剪函数慢得多:

public static String ltrim(String s) {
    int i = 0;
    while (i < s.length() && Character.isWhitespace(s.charAt(i))) {
        i++;
    }
    return s.substring(i);
}

public static String rtrim(String s) {
    int i = s.length()-1;
    while (i >= 0 && Character.isWhitespace(s.charAt(i))) {
        i--;
    }
    return s.substring(0,i+1);
}

来源:http ://www.fromdev.com/2009/07/playing-with-java-string-trim-basics.html

此外,还有一些提供此类功能的库。例如,Spring StringUtils。Apache Commons StringUtils 也提供了类似的功能:strip、stripStart、stripEnd

StringUtils.stripEnd("abc  ", null)    = "abc"
于 2013-03-22T09:47:39.877 回答
10
import org.apache.commons.lang3.StringUtils;

private String rTrim(String str) {
    return StringUtils.stripEnd(str, /*stripChars*/" ");
}

private String lTrim(String str) {
    return StringUtils.stripStart(str, /*stripChars*/" ");
}
于 2016-06-22T20:55:54.250 回答
4

您可以简单地尝试以下

String s = "  Hello world  "

String ltrim = s.stripLeading();

String rtrim = s.stripTrailing();
于 2020-10-06T19:51:41.750 回答
3

Guava 有CharMatcher trimLeadingFrom 和 trimTrailingFrom

例如CharMatcher.whitespace.trimTrailingFrom(s)

于 2017-08-25T22:58:56.303 回答
2

根据@bezmax 的回答,我查看了 Spring StringUtils,但它不能证明我切换到 Spring 框架的过载是合理的。因此,我决定创建一个Characters类来轻松地左/右修剪任何给定字符(-class)的字符串。该课程可在GitHub上找到。

Characters.valueOf('x').trim( ... )
Characters.valueOf('x').leftTrim( ... )
Characters.valueOf('x').rightTrim( ... )

如果您想修剪空格,可以使用预定义的字符类:

Characters.WHITESPACE.trim( ... )
Characters.WHITESPACE.leftTrim( ... )
Characters.WHITESPACE.rightTrim( ... )

该类确实还具有其他类型的字符操作,condense例如replacesplit

于 2016-01-04T20:12:43.617 回答
1

可能有点便宜,但您也可以在没有任何其他库的情况下使用这些:

final var string = "   Hello World   ";

final var rtrimmed = ("." + string).trim().substring(1);
// => "   Hello World"

var ltrimmed = (string + ".").trim();
ltrimmed = ltrimmed.substring(0, ltrimmed.length - 1);
// => "Hello World   "

我承认,这ltrimmed不是那么漂亮,但它会成功。

于 2019-10-15T11:45:15.930 回答