我有一个来自 UI 的字符串,它可能包含控制字符,我想删除除回车、换行和制表符之外的所有控制字符。
现在我可以找到两种方法来删除所有控制字符:
1-使用番石榴:
return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);
2-使用正则表达式:
return string.replaceAll("\\p{Cntrl}", "");
如果您想删除其他或控制 uni-code 类别中的所有字符,您可以这样做
System.out.println(
"a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd
注意:这实际上从字符串中删除(除其他外)'\u008f' Unicode 字符,而不是转义形式的“%8F”字符串。
一种选择是使用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
“除了回车、换行和制表符”。
使用这些
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 来测试网页屏幕。我使用 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 " 变成 " "。
StringUtils.deleteWhiteSpace(text)
从Apache Commons Lang使用。