Почему .replaceAll() работает неправильно?

У меня две струны.

String wef = "83 Cool 4555"; // From server
String wef2 = "83 Cool 4555"; // From server

wef = wef.replaceAll("/[^A-Za-z0-9- ]/", "").replaceAll("\\s+", " ");
wef2 = wef2.replaceAll("\\s+", " ");

wef.contains(wef2); // Returns FALSE.

Если я распечатаю значения wef и wef2, а затем сравню их в средстве проверки различий, я получу это из средства проверки различий:

https://i.imgur.com/zIJX1ZT.png

Что-то не так с пробелами, хотя я заменил все \\s+ на обычный пробел. Почему .replaceAll() работает неправильно?

Когда я запускаю этот фрагмент, wef.contains(wef2) возвращает true... Вы проверили байтовые коды строки или скопировали их в HEX-редактор, чтобы проверить, действительно ли пробелы являются пробелами?

sekky 05.05.2019 20:38
возвращает истину
Benjamin Urquhart 05.05.2019 20:38

Java — это не JavaScript. Сингакса /regex/flags нет, а просто regex, возможно, с (?flags)regex. Так что уберите эти /.

Pshemo 05.05.2019 20:43

@BenjaminUrquhart, к сожалению, вы не получаете те же значения, что и я, с моего сервера, поэтому мой сервер должен возвращать разные значения пространства. Но возникает вопрос, почему replaceAll("\\s", "") не работает?

Jeff smith 05.05.2019 21:03

@Jeffsmith, у меня есть только одна идея: пробел != непечатаемый. Попробуйте сравнить свои строки в любом просмотрщике байтов.

Bor Laze 05.05.2019 21:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Избавьтесь от начальных и конечных косых черт, если только вы не ищете фактически небуквенно-цифровые (-дефисные-пробелы) символы, окруженные косой чертой:

wef.replaceAll("[^A-Za-z0-9- ]", "").replaceAll("\\s+", " ")

Просто возможная причина - сервер возвращает «разные пробелы». Взгляните на этот код - он работает именно так, как вы написали:

    String wef = "83 Cool 4555"; // From server
    String wef2 = "83\u00A0Cool\u00A04555"; // From server

    wef = wef.replaceAll("[^A-Za-z0-9- ]", "").replaceAll("\\s+", " ");
    wef2 = wef2.replaceAll("\\s+", " ");

    log.debug(wef);
    log.debug(wef2);

    assertFalse(wef.contains(wef2));

но вывод выглядит одинаково:

DEBUG 22:25:54.879 [main] (AAA.java:22) 83 Cool 4555
DEBUG 22:25:54.888 [main] (AAA.java:23) 83 Cool 4555

Почему? Потому что в первой строке у нас есть пробел, а во второй «неразрывный пробел».

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