Группа регулярных выражений специального символа не соответствует

Я хочу очистить свой текст и сохранить только символы из u0020-uD7FF и uE000-uFFFD.

public String removeSpecChars() {
    String myText = "test�";
    return myText.replaceAll("[^\\u0020-\\uD7FF\\uE000-\\uFFFD]", "");
    // expected => test
    // result => test�
}

Я не понимаю, почему это не работает. Невозможно использовать шестнадцатеричные числа в регулярном выражении?

Потому что вы не назначаете/не возвращаете новое текстовое значение строковой переменной.

Wiktor Stribiżew 27.08.2024 11:55

Это просто пример, я возвращаю значение замены (я отредактировал свой вопрос)

Valeriane 27.08.2024 11:58

ОК, а что тогда не работает? Чего вы ожидаете? Имейте в виду, что ваша строка заканчивается на \u{FFFD}, и вы ЯВНО просите свой шаблон НЕ соответствовать этому символу.

Wiktor Stribiżew 27.08.2024 12:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не думаю, что 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 и я проголосую за вас

g00se 27.08.2024 12:13
Ответ принят как подходящий

Символ известен как «Символ замены», его кодовая точка в Юникоде — U+FFFD или в Java \uFFFD.

Во-первых, ваше регулярное выражение "[^\\u0020-\\uD7FF\\uE000-\\uFFFD]" неверно, оно должно быть примерно таким: "[^ -\uD7FF\uE000-\uFFFD]+"

Но, как вы можете видеть, ваше регулярное выражение не исключает -> \uFFFD, если вы хотите удалить также , вам нужно изменить свое регулярное выражение примерно так:

"[^ -\uD7FF\uE000-\uFFFC]+"
 ----------------------^   // This is just an example.

Другие вопросы по теме