Как получить буквенно-цифровую строку из любой строки в Java?
Возможный дубликат:
ń ǹ ň ñ ṅ ņ ṇ ṋ ṉ ̈ ɲ ƞ>> -> n или Удалить диакритические знаки из символов Юникода
Как заменить специальные символы в строке?
Я хотел бы отформатировать некоторые строки, такие как "I>Télé"
что-то вроде "itele"
, Идея состоит в том, что я хочу, чтобы моя строка была в нижнем регистре (сделано), без пробелов (сделано), без акцентов или специальных символов (например, >
, <
, /
, %
, ~
, é
, @
, ï
так далее).
Это нормально, чтобы удалить вхождения специальных символов, но я хочу сохранить буквы при удалении акцентов (как я сделал в моем примере). Вот то, что я сделал, но я не думаю, что хорошее решение - это заменить каждое é,è,ê,ë на "e", чем сделать это снова для "i","a" и т. Д., А затем удалить все особый персонаж...
String name ="I>télé" //example
String result = name.toLowerCase().replace(" ", "").replace("é","e").........;
Цель этого - предоставить правильное имя файла для ресурсов для приложения Android, поэтому, если у вас есть другие идеи, я возьму их!
3 ответа
Вы можете использовать java.text.Normalizer
класс для преобразования вашего текста в обычные латинские символы, за которыми следуют диакритические знаки (акценты), где это возможно. Так, например, односимвольная строка "é"
станет двухсимвольной строкой ['e', {COMBINING ACUTE ACCENT}]
,
После того, как вы это сделаете, ваша строка будет представлять собой комбинацию символов без акцента, модификаторов акцента и других специальных символов, которые вы упомянули. На этом этапе вы можете фильтровать символы в вашей строке, используя только белый список, чтобы сохранить то, что вы хотите (что может быть так просто, как [A-Za-z0-9]
для регулярного выражения, в зависимости от того, что вы после).
Подход может выглядеть так:
String name ="I>télé"; //example
String normalized = Normalizer.normalize(name, Form.NFD);
String result = normalized.replaceAll("[^A-Za-z0-9]", "");
Вы можете сделать что-то вроде
String res = ""
for (char c : name.toCharArray()) {
if (Character.isLetter(c) ||Character.isDigit(c))
res += c
}
//Normalize using the method below
http://blog.smartkey.co.uk/2009/10/how-to-strip-accents-from-strings-using-java-6/
public static String stripAccents(String s) {
s = Normalizer.normalize(s, Normalizer.Form.NFD);
s = s.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
return s;
}