Мне нужно заменить все специальные управляющие символы в строке на Java.
Я хочу спросить Google Maps API v3, и Google, похоже, не любит эти символы.
Пример: http://www.google.com/maps/api/geocode/json?sensor=false&address=NEW%20YORK%C2%8F
Этот URL-адрес содержит следующий символ: http://www.fileformat.info/info/unicode/char/008f/index.htm
Итак, я получаю некоторые данные, и мне нужно геокодировать эти данные. Я знаю, что какой-то персонаж не прошел бы геокодирование, но точного списка не знаю.
Мне не удалось найти никакой документации по этой проблеме, поэтому я думаю, что список символов, которые не нравятся Google, выглядит следующим образом: http://www.fileformat.info/info/unicode/category/Cc/list.htm
Есть ли уже встроенная функция, чтобы избавиться от этих символов, или мне нужно создать новую с заменой по одному?
Или есть хорошее регулярное выражение для выполнения этой работы?
И кто-нибудь знает, какой точный список символов Google не любит?
Изменить: Google создал для этого веб-страницу:
https://developers.google.com/maps/documentation/webservices/?hl=fr#BuildingURLs
Ответ 1 · рейтинг 11 · polygenelubricants
Если вы хотите удалить все символы в категории Other/Control Unicode, вы можете сделать что-то вроде этого:
System.out.println(
"a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd
Обратите внимание, что это фактически удаляет (среди прочего) символ '\u008f' Unicode из строки, а не строку экранированной формы "%8F".
Если черный список не захвачен одним блоком/категорией Unicode, в Java есть мощная арифметика классов символов с пересечением, вычитанием и т. д., которую вы можете использовать. В качестве альтернативы вы также можете использовать отрицательный подход к белому списку, то есть вместо явного указания того, какие символы недопустимы, вы указываете, какие символы являются допустимыми, а все остальное становится недопустимым.
API-ссылки
Примеры
Вот пример вычитания:
System.out.println(
"regular expressions: now you have two problems!!"
.replaceAll("[a-z&&[^aeiou]]", "_")
);
// _e_u_a_ e___e__io__: _o_ _ou _a_e __o __o__e__!!
[...] - это класс символов. Что-то вроде [aeiou] соответствует одной из строчных гласных. [^...] - это инвертированный класс символов. [^aeiou] соответствует одному из любых, кроме гласных нижнего регистра.
[a-z&&[^aeiou]] соответствует [a-z] за вычетом [aeiou], то есть всех согласных нижнего регистра.
В следующем примере показан подход с отрицательным белым списком:
System.out.println(
"regular expressions: now you have two problems!!"
.replaceAll("[^a-z]", "_")
);
// regular_expressions__now_you_have_two_problems__
Допустимы только строчные буквы a-z; все остальное незаконно.