以下代码替换字符串中的特殊字符。例如,“áãç”变成“aac”。
import java.text.Normalizer;
public class Util {
public static String formatString(String s) {
String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD);
return temp.replaceAll("[^\\p{ASCII}]","");
}
}
但是,实际上,我不明白它是如何工作的(我只知道它工作正常)。 谁能解释一下?
答案 0 :(得分:1)
\ p {ASCII} ==>所有ASCII:[\ x00- \ x7F]
[\x00-\x7F]
==>此范围是ascii字符。如果任何字符的ascii值落在此范围之间,则找到匹配。
[^\\p{ASCII}]
==>如果任何字符的ascii值不在此范围之间,则找到匹配。
检查Patter class的 POSIX字符类(仅限US-ASCII)部分
答案 1 :(得分:1)
我很确定只添加正则表达式以确保没有任何“非法”仍然存在。
标准化器完成繁重的工作。根据javadoc,您可以查看“http://www.unicode.org/reports/tr15/tr15-23.html”以获取有关NFD标准化的更多信息。
答案 2 :(得分:0)
NFD将字母分解为不同的代码点(例如,“à”被分解为“a,结合急性重音” - 两个unicode字符)。
Java regexes中的\p{ASCII}
“class”表示所有也是ASCII字符的Unicode字符。
因此,正则表达式将删除所有不 ASCII的Unicode字符;结果。
Normalizer
javadoc对Unicode {de,} composition有更好的解释。