在Java中,什么是LTRIM和RTRIM的良好替代方案?

在Java中,什么是LTRIM和RTRIM的良好替代方案?,java,string,trim,Java,String,Trim,Java中JavaScriptltrim()和rtrim()函数的好替代方法是什么?使用正则表达式,您可以编写: String s = ... String ltrim = s.replaceAll("^\\s+",""); String rtrim = s.replaceAll("\\s+$",""); 如果必须经常这样做,可以创建并编译一个模式以获得更好的性能: private final static Pattern LTRIM = Pattern.compile("^\\s+");

Java中JavaScript
ltrim()
rtrim()
函数的好替代方法是什么?

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

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秒)


我个人认为regex方法更具可读性,也不太容易出错,但如果性能是一个问题,你应该使用循环解决方案。

使用regex可能很好,但它比简单的修剪函数慢得多:

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);
}

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

如果要修剪空白,可以使用预定义的字符类:

Characters.WHITESPACE.trim( ... )
Characters.WHITESPACE.leftTrim( ... )
Characters.WHITESPACE.rightTrim( ... )
该类还具有其他类型的字符操作,例如
压缩
替换
拆分

番石榴有trimLeadingFrom和trimTrailingFrom

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*/" ");
}

e、 g.
CharMatcher.whitespace.trimTrailingFrom(s)

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

final var string=“Hello World”;
最终变量rtrimmed=(“+string).trim().substring(1);
//=>“你好,世界”
var ltrimmed=(字符串+”).trim();
ltrimmed=ltrimmed.substring(0,ltrimmed.length-1);
//=>“你好,世界”

我承认,
ltrimmed
没有那么漂亮,但它会起作用。

您可以简单地尝试以下方法

String s = "  Hello world  "

String ltrim = s.stripLeading();

String rtrim = s.stripTrailing();

我本想让您看看Commons Lang StringUtils,但它们没有ltrim/rtrim(或lstrip/rstrip)+1那么…@Thilo,是的,他们有。请参阅我对答案的最后一次编辑。@Max:谢谢,对我最喜欢的库的信心恢复了。+1。不过我不会称之为“trim”,因为String#trim不会修剪空白,它会修剪控制字符和一些仅限ASCII的空白。Commons Lang将他们的版本(做你所做的和每个人可能想要的)称为“strip”。如果可以的话,另一个+1用于Spring中StringUtils的链接,它有“trimmLeadingWhitespace”。是的,@Thilo是对的。要使它像原来的java trim函数一样工作,只需将条件更改为
s.charAt(i),但不要这样做。原始的trim规范看起来很奇怪。这不应该是
而(i>=0…
?否则,
rtrim(“”
返回一个空格字符。
replaceFirst
是更好的答案。这从Java 11开始就可用了。不再需要自定义代码或外部库。
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*/" ");
}
String s = "  Hello world  "

String ltrim = s.stripLeading();

String rtrim = s.stripTrailing();