请问你能解释这个正则表达式(替换字符串中的特殊字符)吗?

时间:2014-02-14 12:54:22

标签: java regex

以下代码替换字符串中的特殊字符。例如,“áãç”变成“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}]",""); 
        }
}

但是,实际上,我不明白它是如何工作的(我只知道它工作正常)。 谁能解释一下?

3 个答案:

答案 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有更好的解释。