34

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

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

1-使用番石榴:

return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

2-使用正则表达式:

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

7 回答 7

28

如果您想删除其他或控制 uni-code 类别中的所有字符,您可以这样做

System.out.println(
    "a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd

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

礼貌:polygenelubricants替换 Unicode 控制字符

于 2012-12-25T07:50:11.927 回答
19

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

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()方法是首选。

于 2012-12-25T07:54:33.360 回答
12

这似乎是一个选择

    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“除了回车、换行和制表符”。

于 2012-12-25T08:09:51.293 回答
8

使用这些

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]", "");
}
于 2018-04-05T07:45:41.873 回答
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
于 2012-12-25T08:04:30.580 回答
1

我正在使用 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 " 变成 " "。

于 2013-04-09T20:40:01.723 回答
-1

StringUtils.deleteWhiteSpace(text)Apache Commons Lang使用。

于 2020-09-01T10:38:22.880 回答