21

次のような非 ASCII 文字や印刷不能文字を含むユーザー入力を受け取ります。

\xc2d
\xa0
\xe7
\xc3\ufffdd
\xc3\ufffdd
\xc2\xa0
\xc3\xa7
\xa0\xa0

例えば:

email : abc@gmail.com\xa0\xa0
street : 123 Main St.\xc2\xa0

望ましい出力:

  email : abc@gmail.com
  street : 123 Main St.

Javaを使用してそれらを削除する最良の方法は何ですか?
次のことを試しましたが、うまくいかないようです

public static void main(String args[]) throws UnsupportedEncodingException {
        String s = "abc@gmail\\xe9.com";
        String email = "abc@gmail.com\\xa0\\xa0";

        System.out.println(s.replaceAll("\\P{Print}", ""));
        System.out.println(email.replaceAll("\\P{Print}", ""));
    }

出力

abc@gmail\xe9.com
abc@gmail.com\xa0\xa0
4

6 に答える 6

53

あなたの要件は明確ではありません。Java のすべての文字Stringは Unicode 文字であるため、それらを削除すると空の文字列が残ります。あなたが意味しているのは、非ASCIIで印刷できない文字を削除したいということだと思います。

String clean = str.replaceAll("\\P{Print}", "");

ここで、は印刷可能な ASCII 文字\p{Print} の POSIX 文字クラスを表し、\P{Print}はそのクラスの補数です。この式では、印刷可能な ASCII ではないすべての文字が空の文字列に置き換えられます。(余分なバックスラッシュは\、文字列リテラルでエスケープ シーケンスを開始するためです。)


どうやら、すべての入力文字は実際には ASCII 文字であり、印刷できない文字または非 ASCII 文字の印刷可能なエンコードを表しています。これらの文字列にはプレーンな印刷可能な ASCII 文字しか含まれていないため、Mongo で問題が発生することはありません。

これはすべて、私には少し怪しいように聞こえます。私が信じているのは、データには実際には印刷不可能な非 ASCII 文字が含まれており、別のコンポーネント (ロギング フレームワークなど) がこれらを印刷可能な表現に置き換えているということです。単純なテストでは、印刷可能な表現を元の文字列に変換することに失敗しているため、最初の正規表現が機能していないと誤って信じています。

それは私の推測ですが、私が状況を読み違えていて、本当にリテラル\xHHエスケープを削除する必要がある場合は、次の正規表現を使用して実行できます。

String clean = str.replaceAll("\\\\x\\p{XDigit}{2}", "");

このクラスの API ドキュメントには、PatternJava の正規表現ライブラリでサポートされているすべての構文がリストされています。すべての構文が何を意味するかについて詳しく知りたい場合は、Regular-Expressions.info サイトが非常に役立ちます。

于 2012-06-13T18:39:42.327 に答える
16

Google Guavaを使用すると、印刷CharMatcherできない文字を削除してから、次のようにすべてのASCII文字を保持できます(アクセントを削除します)。

String printable = CharMatcher.INVISIBLE.removeFrom(input);
String clean = CharMatcher.ASCII.retainFrom(printable);

それが本当に必要かどうかはわかりませんが、質問のサンプルデータでエスケープシーケンスとして表現されているものはすべて削除されます。

于 2012-06-13T18:47:47.113 に答える
14

遅いかもしれませんが、今後の参考のために:

String clean = str.replaceAll("\\P{Print}", "");

印刷できないすべての文字を削除しますが、これには\n(改行)、\t(タブ)、および\r(キャリッジ リターン) が含まれます。これらの文字を保持したい場合もあります。

その問題については、逆ロジックを使用します。

String clean = str.replaceAll("[^\\n\\r\\t\\p{Print}]", "");
于 2015-07-15T07:33:26.990 に答える
4

このコードを試すことができます:

public String cleanInvalidCharacters(String in) {
    StringBuilder out = new StringBuilder();
    char current;
    if (in == null || ("".equals(in))) {
        return "";
    }
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9)
                || (current == 0xA)
                || (current == 0xD)
                || ((current >= 0x20) && (current <= 0xD7FF))
                || ((current >= 0xE000) && (current <= 0xFFFD))
                || ((current >= 0x10000) && (current <= 0x10FFFF))) {
            out.append(current);
        }

    }
    return out.toString().replaceAll("\\s", " ");
}

から無効な文字を削除するとうまくいきますString

于 2012-06-13T18:17:49.877 に答える
2

java.text.normalizer を使用できます

于 2012-06-13T18:17:42.700 に答える