JDKの String.trim() メソッドはかなり単純で、ASCII制御文字のみを削除します。
Apache Commonsの StringUtils.strip() は少し優れていますが、JDKの Character.isWhitespace() を使用しています 非改行スペースを空白 。
では、Javaで文字列をトリムする最も完全で、Unicode互換の、安全で適切な方法は何でしょうか。
ちなみに、commons-lang
よりもこのようなものに使用すべきライブラリはありますか?
Googleは guava-libraries を最近利用可能にしました。それ 持っているかもしれません あなたが探しているもの:
CharMatcher.inRange('\0', ' ').trimFrom(str)
string.trim()と同じですが、何をトリムするかをカスタマイズできます。JavaDocを参照してください。
たとえば、JDKとは異なり、最新のUnicode標準に従って定義されている WHITESPACEの独自の定義 があるため、必要なものは次のように記述できます。
CharMatcher.WHITESPACE.trimFrom(str)
私は質問を投稿した後にこれを見たと誓います:Googleがリリースされました Guava 、コアJavaユーティリティのライブラリです。
私はまだこれを試していませんが、私が知ることができることから、これは完全にUnicodeに準拠しています。
String s = " \t testing \u00a0"
s = CharMatcher.WHITESPACE.trimFrom(s);
空白を構成するものを定義することは本当に難しいです。ときどき、分割されないようにするために、分割できないスペースを使用します。だから、あなたが望んでいることを正確に行うためのライブラリを見つけるのは難しいでしょう。
すべての空白を削除したい場合は、独自のtrim()を使用します。これは、空白をチェックするために使用する関数です。
public static boolean isWhitespace (int ch)
{
if (ch == ' ' || (ch >= 0x9 && ch <= 0xD))
return true;
if (ch < 0x85) // short-circuit optimization.
return false;
if (ch == 0x85 || ch == 0xA0 || ch == 0x1680 || ch == 0x180E)
return true;
if (ch < 0x2000 || ch > 0x3000)
return false;
return ch <= 0x200A || ch == 0x2028 || ch == 0x2029
|| ch == 0x202F || ch == 0x205F || ch == 0x3000;
}
私は常にtrim
がほとんどすべてのシナリオでかなりうまく機能することを発見しました。
ただし、本当に文字を追加したい場合は、_commons-lang
_の strip
メソッドを編集して、_Character.isWhitespace
_のテストだけでなく、 _Character.isSpaceChar
_の場合、が不足しているように見えるつまり、それぞれstripStart
とstripEnd
にある次の行:
while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))
Javaのtrim()メソッドに少し変更を加え、非ASCII文字をサポートしています。このメソッドは、ほとんどの実装よりも高速に実行されます。
public static String trimAdvanced(String value) {
Objects.requireNonNull(value);
int strLength = value.length();
int len = value.length();
int st = 0;
char[] val = value.toCharArray();
if (strLength == 0) {
return "";
}
while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) {
st++;
if (st == strLength) {
break;
}
}
while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) {
len--;
if (len == 0) {
break;
}
}
return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value;
}
これはUnicode文字を処理し、追加のライブラリを必要としません。
String trimmed = original.replaceAll ("^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$", "");
Wikipedia にリストされている、Unicode文字プロパティ "WSpace = Y"のない関連する空白文字がいくつかあります。これらはおそらく問題を引き起こしませんが、キャラクタークラスに簡単に追加することもできます。
almson-regex を使用すると、正規表現は次のようになります。
String trimmed = original.replaceAll (either (START_BOUNDARY + oneOrMore (WHITESPACE), oneOrMore (WHITESPACE) + END BOUNDARY), "");
非Unicode空白のより関連性の高いものを含めます。