如何从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]", ""); }
- 如何比较两个MultiMaps?
- 组合guava eventbus和AWT Event线程处理的最佳方法
- IllegalAnnotationsException SetMultimap是一个接口,JAXB无法处理接口
- java – google guava缓存invalidateAll()和cleanUp()之间的区别
- Java为高并发情况限制了非阻塞缓冲区
- 我是否使用Google Guava正确实现了equals和hashCode?
- 当有人使用MapMaker或WeakHashMaps时,有人可以向我解释一下吗?
- 在spring xml config中定义guava HashBasedTable / Table
- Java Guava组合Multimap和Cache