Java中LTRIM和RTRIM的一个很好的替代品是什么?

yeg*_*256 48 java string trim

Java 中JavaScript ltrim()rtrim()函数的一个很好的替代品是什么?

ass*_*ias 51

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

String s = ...
String ltrim = s.replaceAll("^\\s+","");
String rtrim = s.replaceAll("\\s+$","");
Run Code Online (Sandbox Code Playgroud)

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

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

public static String ltrim(String s) {
    return LTRIM.matcher(s).replaceAll("");
}
Run Code Online (Sandbox Code Playgroud)

从性能角度来看,快速微观基准显示(在JIT编译之后)正则表达式方法比循环慢约5倍(0.49s与100万ltrim的0.11s).

我个人觉得正则表达式方法更具可读性且不易出错,但如果性能问题,则应使用循环解决方案.

  • `replaceFirst`更好 (8认同)

bez*_*max 30

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

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);
}
Run Code Online (Sandbox Code Playgroud)

资料来源: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"
Run Code Online (Sandbox Code Playgroud)

  • +1.我不会称之为"修剪",因为String#trim不会修剪空白,它会修剪控制字符和一些仅限ASCII的空格.Commons Lang称他们的版本(你做你做的和每个人都想要的)"剥离". (4认同)

Yan*_*iel 7

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*/" ");
}
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以简单地尝试以下操作

String s = "  Hello world  "

String ltrim = s.stripLeading();

String rtrim = s.stripTrailing();
Run Code Online (Sandbox Code Playgroud)