У меня две струны.
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() работает неправильно?
Java — это не JavaScript. Сингакса /regex/flags
нет, а просто regex
, возможно, с (?flags)regex
. Так что уберите эти /
.
@BenjaminUrquhart, к сожалению, вы не получаете те же значения, что и я, с моего сервера, поэтому мой сервер должен возвращать разные значения пространства. Но возникает вопрос, почему replaceAll("\\s", "") не работает?
@Jeffsmith, у меня есть только одна идея: пробел != непечатаемый. Попробуйте сравнить свои строки в любом просмотрщике байтов.
Избавьтесь от начальных и конечных косых черт, если только вы не ищете фактически небуквенно-цифровые (-дефисные-пробелы) символы, окруженные косой чертой:
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
Почему? Потому что в первой строке у нас есть пробел, а во второй «неразрывный пробел».
Когда я запускаю этот фрагмент, wef.contains(wef2) возвращает true... Вы проверили байтовые коды строки или скопировали их в HEX-редактор, чтобы проверить, действительно ли пробелы являются пробелами?