如何从java字符串中删除控制字符?

我有一个来自UI的字符串,可能包含控制字符,我想删除除回车符换行符制表符之外的所有控制字符。

现在我可以找到两种方法来删除所有控制字符:

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字符,而不是转义forms的“%8F”字符串。

礼貌: polygenelubricants ( 替换Unicode控制字符 )

一种选择是使用CharMatcher的组合:

 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就像你说的“除了回车,换行和标签”。

我正在使用Selenium来测试网页屏幕。 我使用Hamcrest断言和匹配器根据各种条件在页面源中搜索不同的字符串。

 String pageSource = browser.getPageSource(); assertThat("Text not found!", pageSource, containsString(text)); 

使用IE或Firefox驱动程序可以正常工作,但在使用HtmlUnitDriver时它会爆炸。 HtmlUnitDriver使用制表符,回车符和其他控制字符格式化页面源。 我在Nidhish Krishnan的巧妙回答上使用了一个riff。 如果我使用Nidish的解决方案“开箱即用”,我留下了额外的空格,所以我添加了一个名为filterTextForComparison的私有方法:

 String pageSource = filterTextForComparison(browser.getPageSource()); assertThat("Text not found!", pageSource, containsString(filterTextForComparison(text))); 

function:

 /** * 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”成为“”。

在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 

使用这些

 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]", ""); }