Я хочу очистить свой текст и сохранить только символы из u0020-uD7FF
и uE000-uFFFD
.
public String removeSpecChars() {
String myText = "test�";
return myText.replaceAll("[^\\u0020-\\uD7FF\\uE000-\\uFFFD]", "");
// expected => test
// result => test�
}
Я не понимаю, почему это не работает. Невозможно использовать шестнадцатеричные числа в регулярном выражении?
Это просто пример, я возвращаю значение замены (я отредактировал свой вопрос)
ОК, а что тогда не работает? Чего вы ожидаете? Имейте в виду, что ваша строка заканчивается на \u{FFFD}
, и вы ЯВНО просите свой шаблон НЕ соответствовать этому символу.
Я не думаю, что Regex достаточно гибок, чтобы соответствовать шестнадцатеричному диапазону, или, по крайней мере, я никогда не использовал его таким образом.
Я рекомендую повторять символы один за другим и сохранять их в пределах определенного диапазона. Вы можете использовать Stream API:
myText = myText.codePoints()
.filter(ch -> (ch >= 0x0020 && ch <= 0xD7FF) || (ch >= 0xE000 && ch <= 0xFFFD))
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
Не знаю, почему вы получили двойной отрицательный голос. Единственная причина, по которой ваш код не совсем корректен, заключается в том, что char
больше не подходит для представления кодовых точек в String
. Измените его на String::codePoints
и я проголосую за вас
Символ �
известен как «Символ замены», его кодовая точка в Юникоде — U+FFFD
или в Java \uFFFD
.
Во-первых, ваше регулярное выражение "[^\\u0020-\\uD7FF\\uE000-\\uFFFD]"
неверно, оно должно быть примерно таким: "[^ -\uD7FF\uE000-\uFFFD]+"
Но, как вы можете видеть, ваше регулярное выражение не исключает �
-> \uFFFD
, если вы хотите удалить также �
, вам нужно изменить свое регулярное выражение примерно так:
"[^ -\uD7FF\uE000-\uFFFC]+"
----------------------^ // This is just an example.
Потому что вы не назначаете/не возвращаете новое текстовое значение строковой переменной.