Как удалить управляющие символы из строки java? - программирование

Как удалить управляющие символы из строки java?

У меня есть строка, исходящая из пользовательского интерфейса, который может содержать управляющие символы, и я хочу удалить все контрольные символы, кроме каретки возвращает, строки и вкладки.

Сейчас я могу найти два способа удалить все управляющие символы:

1- использование guava:

return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);

2- с использованием регулярного выражения:

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

Ответ 1

Вы можете сделать что-то подобное, если хотите удалить все символы в другой или категории уником-кода

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

Примечание: Это фактически удаляет символ "\ u008f" Unicode из строки, а не строку с сохраненной формой "% 8F".

Предоставлено: polygenelubricants (Заменить символы управления Unicode)

Ответ 2

Один из вариантов заключается в использовании комбинации CharMatcher s:

CharMatcher charsToPreserve = CharMatcher.anyOf("\r\n\t");
CharMatcher allButPreserved = charsToPreserve.negate();
CharMatcher controlCharactersToRemove = CharMatcher.JAVA_ISO_CONTROL.and(allButPreserved);

Затем используйте removeFrom, как и раньше. Я не знаю, насколько он эффективен, но, по крайней мере, прост.

Ответ 3

Кажется, это вариант

    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 так же, как вы сказали "кроме возвратов каретки, строк и вкладок".

Ответ 4

Я использую Selenium для тестирования веб-экранов. Я использую Hamcrest asserts и matchers для поиска источника страницы для разных строк на основе различных условий.

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", становясь "".

Ответ 5

В регулярном выражении 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