制御文字を含む可能性のある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
注:これにより、エスケープされたフォーム「%8F」文字列ではなく、文字列から「\ u008f」Unicode文字が実際に削除されます。
礼儀: polygenelubricants ( nicode制御文字の置き換え )
1つのオプションは、CharMatcher
sの組み合わせを使用することです。
CharMatcher charsToPreserve = CharMatcher.anyOf("\r\n\t");
CharMatcher allButPreserved = charsToPreserve.negate();
CharMatcher controlCharactersToRemove = CharMatcher.Java_ISO_CONTROL.and(allButPreserved);
次に、以前と同様にremoveFrom
を使用します。どれほど効率的かはわかりませんが、少なくとも簡単です。
これはオプションのようです
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
「キャリッジリターン、ラインフィード、タブを除く」と同じように。
これらを使用する
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]", "");
}
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
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」が「」になるのをキャッチしませんでした。