Не работает \\s для некоторых пробельных символов

Рейтинг: -2Ответов: 2Опубликовано: 29.04.2023

Есть код:

String square = "";
if (title.contains("м²")) {
  String regex = "\\d+([,.]\\d+)?\\s*м²";
    
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(title);
    
  if (matcher.find()) {
    square = matcher.group();
  }
}

И есть строки:

Апартаменты-студия, 22,8 м², 1/5 эт. 
2-к. квартира, 50 м², 4/5 эт.

Код не находит соответствия regex в строках. Само выражение проверял на сторонних сервисах - находит.

Что может быть?

Ответы

▲ 0

Проблема оказалась в каком-то непечатаемом символе. Выглядит как пробел, но пробелом не является.

В режиме отладки из title скопировал этот "пробел" в regex, и всё заработало.

▲ 0

Такая проблема может возникнуть, если между числом и единицей измерения используется неразрывный пробел.

В соответствии с документацией Java, класс \s (пробельный символ) соответствует регулярному выражению:

[ \t\n\x0B\f\r]

В то время как класс \h (горизонтальный пробельный символ) это:

[ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

Чтобы в вашем регулярном выражении учесть неразрывный пробел, используйте комбинацию из двух классов [\s\h] вместо обычного \s.

Например:

String regex = "\\d+([,.]\\d+)?[\\s\\h]*м²"