web-dev-qa-db-ja.com

JavaのLTRIMとRTRIMの良い代替手段は何ですか?

JavaのJavaScript ltrim()およびrtrim()関数の適切な代替手段は何ですか?

45
yegor256

正規表現を使用すると、次のように記述できます。

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.19秒に対して0.49秒)。

個人的には、正規表現のアプローチは読みやすく、エラーが発生しにくいと思いますが、パフォーマンスが問題になる場合は、ループソリューションを使用する必要があります。

47
assylias

正規表現を使用するのはいいかもしれませんが、単純なトリミング関数よりもかなり遅いです:

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"
29
bezmax
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*/" ");
}
6
Yanniel

グアバには CharMatcher trimLeadingFromとtrimTrailingFromがあります

例えばCharMatcher.whitespace.trimTrailingFrom(s)

2
Andrew McKinlay

@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( ... )

このクラスは、condensereplace、またはsplitなど、他の種類の文字操作も備えています。

1