2012-07-18 210 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; 
} 
相关问题