2012-07-18 223 views
1

可能重複:
ń ǹ ň ñ ṅ ņ ṇ ṋ ṉ ̈ ɲ ƞ ᶇ ɳ ȵ --> n or Remove diacritical marks from unicode chars
How to replace special characters in a string?如何從Java中的任何字符串獲取字母數字字符串?

我想一些字符串如"I>Télé"格式化爲類似"itele"。 的想法是,我希望我的字符串是小寫(完成),無空白字符(完成),無重音或特殊字符(如></%~é@ï等)。

可以刪除特殊字符的出現,但我想保留字母,同時刪除重音符號(就像我在我的例子中所做的那樣)。這是我所做的,但我認爲最好的解決方案是用「e」替換每一個é,è,ê,ë,而不是像「i」,「a」等那樣再去掉每一個é,è,ê,特殊字符...

String name ="I>télé" //example 
String result = name.toLowerCase().replace(" ", "").replace("é","e").........; 

的這樣做的目的是爲Android應用提供對資源的有效文件名,因此,如果您有任何其他的想法,我要了!

+1

也許[這](http://stackoverflow.com/a/1453284/1343161)答案可以幫助你嗎? – Keppil 2012-07-18 08:16:19

回答

8

如果可能,可以使用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]", ""); 
+2

感謝提供的鏈接,我發現[this](http://stackoverflow.com/a/4122207/1520739)。解決方案將是這個和replaceAll(「[^ A-Za-z0-9]」,「」)的組合。非常感謝! – Thibault 2012-07-18 08:37:12

+0

+1在Normalizer中進行思考 – 2012-07-18 08:48:20

0

你可以做這樣的事情

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; 
} 
相關問題