34

制御文字を含む可能性のある UI からの文字列があり、キャリッジ リターンライン フィード、およびタブを除くすべての制御文字を削除したいと考えています。

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

1- グアバを使用:

return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

2- 正規表現を使用:

return string.replaceAll("\\p{Cntrl}", "");
4

7 に答える 7

28

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

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

注 :これにより、文字列から (特に) '\u008f' Unicode 文字が実際に削除されます。エスケープされた形式の "%8F" 文字列ではありません。

礼儀: polygenelubricants ( Unicode 制御文字を置き換えます)

于 2012-12-25T07:50:11.927 に答える
19

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

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

その後は元通り使用removeFrom。それがどれほど効率的かはわかりませんが、少なくとも単純です。


編集で述べたようにJAVA_ISO_CONTROL、Guava では非推奨になりました。このjavaIsoControl()方法をお勧めします。

于 2012-12-25T07:54:33.360 に答える
12

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

    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「キャリッジリターン、ラインフィード、タブを除く」と言ったとおりに印刷します。

于 2012-12-25T08:09:51.293 に答える
1

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

まず、このメソッドは制御文字をスペースに置き換え、次に複数のスペースを 1 つのスペースに置き換えます。「\p{Cc}+?」で一気にやってみた しかし、「\t」が「」になるのをキャッチしませんでした。

于 2013-04-09T20:40:01.723 に答える
1

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
于 2012-12-25T08:04:30.580 に答える