我从UI获取了一个字符串,其中可能包含控制字符,我想要移除所有控制字符,但保留回车、换行和制表符。
目前我找到两种方法可以移除所有控制字符:
1- 使用guava:
return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);
2- 使用正则表达式:
return string.replaceAll("\\p{Cntrl}", "");
如果您想删除其他或控制Unicode类别中的所有字符,可以像这样做。
System.out.println(
"a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd
注意:这实际上是从字符串中移除(其中包括)Unicode字符'\u008f',而不是转义形式的"%8F"字符串。
一种选择是使用CharMatcher
的组合:
CharMatcher charsToPreserve = CharMatcher.anyOf("\r\n\t");
CharMatcher allButPreserved = charsToPreserve.negate();
CharMatcher controlCharactersToRemove = CharMatcher.JAVA_ISO_CONTROL.and(allButPreserved);
然后像以前一样使用removeFrom
。我不知道它的效率如何,但至少很简单。
正如编辑中所指出的,Guava现在已经弃用了JAVA_ISO_CONTROL
;更推荐使用javaIsoControl()
方法。
CharMatcher.javaIsoControl()
现在已经被弃用,应使用 JAVA_ISO_CONTROL
。 - Zon这似乎是一个选项
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 removeNoneAscii(String str){
return str.replaceAll("[^\\x00-\\x7F]", "");
}
public static String removeNonePrintable(String str){ // All Control Char
return str.replaceAll("[\\p{C}]", "");
}
public static String removeOthersControlChar(String str){ // Some Control Char
return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "");
}
public static String removeAllControlChars(String str)
{
return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");
}
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
String pageSource = browser.getPageSource();
assertThat("Text not found!", pageSource, containsString(text));
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;
}
String str = "\n\t\t\tsome text\t\t\n";
StringUtils.trimAllWhitespace(str); // some text
CharMatcher.JAVA_ISO_CONTROL
在Guava的后续版本中已被弃用。您可以使用CharMatcher.javaIsoControl()
代替。 - Lorcan O'Neill