繁体   English   中英

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

[英]How to remove control characters from java string?

我有一个来自 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

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

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

["

    String s = "\u0001\t\r\n".replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
    for (char c : s.toCharArray()) {
        System.out.print((int) c + " ");
    }

使用这些

public static String removeNoneAscii(String str){
    return str.replaceAll("[^\\x00-\\x7F]", "");
}

public static String removeNonePrintable(String str){ // All Control Char
    return str.replaceAll("[\\p{C}]", "");
}

public static String removeOthersControlChar(String str){ // Some Control Char
    return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", "");
}

public static String removeAllControlChars(String str)
{
    return removeNonPrintable(str).replaceAll("[\\r\\n\\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

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

你可以使用 Spring 中的 StingUtils:

String str = "\n\t\t\tsome text\t\t\n";
StringUtils.trimAllWhitespace(str); // some text

使用来自Apache Commons LangStringUtils.deleteWhiteSpace(text)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM