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.19秒に対して0.49秒)。
個人的には、正規表現のアプローチは読みやすく、エラーが発生しにくいと思いますが、パフォーマンスが問題になる場合は、ループソリューションを使用する必要があります。
正規表現を使用するのはいいかもしれませんが、単純なトリミング関数よりもかなり遅いです:
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"
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*/" ");
}
グアバには CharMatcher trimLeadingFromとtrimTrailingFromがあります
例えばCharMatcher.whitespace.trimTrailingFrom(s)
@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
、replace
、またはsplit
など、他の種類の文字操作も備えています。