web-dev-qa-db-ja.com

Javaで文字列から空白を適切に削除する方法は?

JDKの String.trim() メソッドはかなり単純で、ASCII制御文字のみを削除します。

Apache Commonsの StringUtils.strip() は少し優れていますが、JDKの Character.isWhitespace() を使用しています 非改行スペースを空白

では、Javaで文字列をトリムする最も完全で、Unicode互換の、安全で適切な方法は何でしょうか。

ちなみに、commons-langよりもこのようなものに使用すべきライブラリはありますか?

41
itsadok

Googleは guava-libraries を最近利用可能にしました。それ 持っているかもしれません あなたが探しているもの:

CharMatcher.inRange('\0', ' ').trimFrom(str)

string.trim()と同じですが、何をトリムするかをカスタマイズできます。JavaDocを参照してください。

たとえば、JDKとは異なり、最新のUnicode標準に従って定義されている WHITESPACEの独自の定義 があるため、必要なものは次のように記述できます。

CharMatcher.WHITESPACE.trimFrom(str)
58
CrazyCoder

私は質問を投稿した後にこれを見たと誓います:Googleがリリースされました Guava 、コアJavaユーティリティのライブラリです。

私はまだこれを試していませんが、私が知ることができることから、これは完全にUnicodeに準拠しています。

String s = "  \t testing \u00a0"
s = CharMatcher.WHITESPACE.trimFrom(s);
7
itsadok

空白を構成するものを定義することは本当に難しいです。ときどき、分割されないようにするために、分割できないスペースを使用します。だから、あなたが望んでいることを正確に行うためのライブラリを見つけるのは難しいでしょう。

すべての空白を削除したい場合は、独自の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;
  }
3
ZZ Coder

私は常にtrimがほとんどすべてのシナリオでかなりうまく機能することを発見しました。

ただし、本当に文字を追加したい場合は、_commons-lang_の strip メソッドを編集して、_Character.isWhitespace_のテストだけでなく、 _Character.isSpaceChar_の場合、が不足しているように見えるつまり、それぞれstripStartstripEndにある次の行:

  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
  • while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))
2
João Silva

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

これは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空白のより関連性の高いものを含めます。

0