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

时间:2012-12-25 07:46:47

标签: java regex string guava

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

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

1-使用番石榴:

return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

2-使用正则表达式:

return string.replaceAll("\\p{Cntrl}", "");

7 个答案:

答案 0 :(得分:23)

如果要删除其他字符或控制单一代码类别

中的所有字符,则可以执行此类操作
System.out.println(
    "a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd

注意:这实际上从字符串中移除了(\ n)其中的'\ u008f'Unicode字符,而不是转义形式的“%8F”字符串。

礼貌:polygenelubricantsReplace Unicode Control Characters

答案 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)