web-dev-qa-db-ja.com

Java文字列から制御文字を削除するには?

制御文字を含む可能性のあるUIからの文字列があり、キャリッジリターン改行、およびタブを除くすべての制御文字を削除したい=。

現在、すべての制御文字を削除する2つの方法を見つけることができます。

1-グアバを使用:

return CharMatcher.Java_ISO_CONTROL.removeFrom(string);

2-正規表現を使用:

return string.replaceAll("\\p{Cntrl}", "");
23
Mahmoud Saleh

他のすべての文字を削除したり、ユニコードカテゴリを制御したい場合は、このようなことを行うことができます

System.out.println(
    "a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd

注:これにより、エスケープされたフォーム「%8F」文字列ではなく、文字列から「\ u008f」Unicode文字が実際に削除されます。

礼儀: polygenelubricantsnicode制御文字の置き換え

22

1つのオプションは、CharMatchersの組み合わせを使用することです。

CharMatcher charsToPreserve = CharMatcher.anyOf("\r\n\t");
CharMatcher allButPreserved = charsToPreserve.negate();
CharMatcher controlCharactersToRemove = CharMatcher.Java_ISO_CONTROL.and(allButPreserved);

次に、以前と同様にremoveFromを使用します。どれほど効率的かはわかりませんが、少なくとも簡単です。

15
Jon Skeet

これはオプションのようです

    String s = "\u0001\t\r\n".replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
    for (char c : s.toCharArray()) {
        System.out.print((int) c + " ");
    }

9 13 10「キャリッジリターン、ラインフィード、タブを除く」と同じように。

8

これらを使用する

public static String removeNonAscii(String str)
{
    return str.replaceAll("[^\\x00-\\x7F]", "");
}

public static String removeNonPrintable(String str) // All Control Char
{
    return str.replaceAll("[\\p{C}]", "");
}

public static String removeSomeControlChar(String str) // Some Control Char
{
    return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "");
}

public static String removeControlCharFull(String str)
{
    return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");
}
3
Ali Bagheri

Java正規表現では、文字クラス内の一部の文字を除外することができます。以下に同様の例を示すサンプルプログラムを示します。

class test {
    public static void main (String argv[]) {
            String testStr="abcdefABCDEF";
            System.out.println(testStr);
            System.out.println(testStr.replaceAll("[\\p{Lower}&&[^cd]]",""));
    }
}

次の出力が生成されます。

abcdefABCDEF
cdABCDEF
1
Raymond Tau

Seleniumを使用してWeb画面をテストしています。 Hamcrestのアサートとマッチャーを使用して、さまざまな条件に基づいて異なる文字列のページソースを検索します。

String pageSource = browser.getPageSource();
assertThat("Text not found!", pageSource, containsString(text));

これは、IEまたはFirefoxドライバーを使用すると正常に機能しますが、HtmlUnitDriverを使用すると爆弾になります。HtmlUnitDriverは、タブ、キャリッジリターン、その他の制御文字でページソースをフォーマットします。上記のNidhish Krishnanの独創的な答えについて。「すぐに」Nidishのソリューションを使用すると、余分なスペースが残るため、filterTextForComparisonという名前のプライベートメソッドを追加しました。

String pageSource = filterTextForComparison(browser.getPageSource());
assertThat("Text not found!", pageSource, 
        containsString(filterTextForComparison(text)));

そして機能:

/**
 * Filter out any characters embedded in the text that will interfere with
 * comparing Strings.
 * 
 * @param text
 *            the text to filter.
 * @return the text with any extraneous character removed.
 */
private String filterTextForComparison(String text) {

    String filteredText = text;

    if (filteredText != null) {
        filteredText = filteredText.replaceAll("\\p{Cc}", " ").replaceAll("\\s{2,}", " ");
    }

    return filteredText;
}

最初に、このメソッドは制御文字をスペースに置き換え、次に複数のスペースを単一のスペースに置き換えます。 「\ p {Cc} +?」ですべてを一度に試しましたしかし、「\ t」が「」になるのをキャッチしませんでした。

1
Steve Gelman