我有来自UI的字符串可能包含控制字符,我想删除除回车,换行和标签之外的所有控制字符
现在我可以找到两种方法来删除所有控制字符:
1-使用番石榴:
return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);
2-使用正则表达式:
return string.replaceAll("\\p{Cntrl}", "");
答案 0 :(得分:23)
如果要删除其他字符或控制单一代码类别
中的所有字符,则可以执行此类操作System.out.println(
"a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd
注意:这实际上从字符串中移除了(\ n)其中的'\ u008f'Unicode字符,而不是转义形式的“%8F”字符串。
答案 1 :(得分:15)
一种选择是使用CharMatcher
s:
CharMatcher charsToPreserve = CharMatcher.anyOf("\r\n\t");
CharMatcher allButPreserved = charsToPreserve.negate();
CharMatcher controlCharactersToRemove = CharMatcher.JAVA_ISO_CONTROL.and(allButPreserved);
然后像以前一样使用removeFrom
。我不知道它的效率如何,但它至少是简单的。
答案 2 :(得分:8)
这似乎是一个选项
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
就像你说的那样“除了回车,换行和标签”。
答案 3 :(得分:2)
使用这些
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]", "");
}
答案 4 :(得分:1)
在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
答案 5 :(得分:1)
我正在使用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)));
功能:
/**
* 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”成为“”。
答案 6 :(得分:-1)
使用Apache Commons Lang中的StringUtils.deleteWhiteSpace(text)
。