制御文字を含む可能性のある UI からの文字列があり、キャリッジ リターン、ライン フィード、およびタブを除くすべての制御文字を削除したいと考えています。
現在、すべての制御文字を削除する 2 つの方法を見つけることができます。
1- グアバを使用:
return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);
2- 正規表現を使用:
return string.replaceAll("\\p{Cntrl}", "");
他のすべての文字を削除したい場合、またはユニコードカテゴリを制御したい場合は、このようなことができます
System.out.println(
"a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd
注 :これにより、文字列から (特に) '\u008f' Unicode 文字が実際に削除されます。エスケープされた形式の "%8F" 文字列ではありません。
1 つのオプションは、CharMatcher
s の組み合わせを使用することです。
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()
方法をお勧めします。
これはオプションのようです
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
「キャリッジリターン、ラインフィード、タブを除く」と言ったとおりに印刷します。
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」が「」になるのをキャッチしませんでした。
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