Как удалить управляющие символы из строки java?
У меня есть строка, исходящая из пользовательского интерфейса, который может содержать управляющие символы, и я хочу удалить все контрольные символы, кроме каретки возвращает, строки и вкладки.
Сейчас я могу найти два способа удалить все управляющие символы:
1- использование guava:
return CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);
2- с использованием регулярного выражения:
return string.replaceAll("\\p{Cntrl}", "");
Ответы
Ответ 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