如何从Java中的任意字符串中获取字母数字字符串? [重复]

问题描述 投票:0回答:3

可能重复:
ń ǹ ň ñ ṅ ņ ṇ ṋ ṉ ̈ ɲ ƞ ᶇ ɳ ş --> n 或从 unicode 字符中删除变音符号
如何替换字符串中的特殊字符?

我想将一些字符串(例如

"I>Télé"
)格式化为
"itele"
之类的内容。 我的想法是,我希望我的字符串是小写的(完成),没有空格(完成),没有重音符号或特殊字符(如
>
<
/
%
~
é
@
ï
等)。

删除出现的特殊字符是可以的,但我想在删除重音符号的同时保留字母(就像我在示例中所做的那样)。这就是我所做的,但我不认为最好的解决方案是将每个 é,è,ê,ë 替换为“e”,而不是对“i”,“a”等再次执行此操作,然后删除每个特殊字符...

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

其目的是为 Android 应用程序的资源提供有效的文件名,所以如果您有任何其他想法,我会采纳!

java string
3个回答
17
投票

您可以使用

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
投票

你可以做类似的事情

StringBuilder res = new StringBuilder();
for (char c : name.toCharArray()) {
    if (Character.isLetter(c) || Character.isDigit(c))
        res.append(c);   
}
s = res.toString();

//Normalize using the method below

http://blog.smartkey.co.uk/2009/10/how-to-strip-acents-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;
}

0
投票

尝试使用ascii代码。 此链接可能会有帮助

© www.soinside.com 2019 - 2024. All rights reserved.