4

从字符串中过滤掉所有 UTF-8 标点字符和符号(如 ✀ ✁ ✂ ✃ ✄ ✅ ✆ ✇ ✈ 等)的最佳和最有效的方法是什么。简单地过滤掉所有不在 az、AZ 和 0-9 中的字符不是一个选项,因为我想保留来自其他语言的字母(ą、ę、ó 等)提前谢谢。

4

4 回答 4

3

尝试 unicode二进制分类的组合:

String fixed = value.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");
于 2013-05-13T16:38:49.603 回答
3

您可以使用\p{L}匹配所有 unicode 字母。例子:

public static void main(String[] args) throws IOException {
    String[] test = {"asdEWR1", "ąęóöòæûùÜ", "sd,", "✀","✁","✂","✃","✄","✅","✆","✇","✈"};
    for (String s : test)
        System.out.println(s + " => " + s.replaceAll("[^\\p{L}^\\d]", ""));
}

输出:

asdEWR1 => asdEWR1
ąęóöòæûùÜ => ąęóöòæûùÜ
sd, => sd
✀ => 
✁ => 
✂ => 
✃ => 
✄ => 
✅ => 
✆ => 
✇ => 
✈ => 
于 2013-05-13T16:41:03.703 回答
1

这个想法是首先删除重音。

public static String onlyASCII(String s) {
    // Decompose any ŝ into s and combining-^.
    String s2 = Normalizer.normalize(s, Normalizer.Form.NFD);
    // Removee all non-ASCII
    return s2.replaceAll("[^\\u0000-\\u007E\\pL]", "");
}

对于希腊字母和此类\\pL字母。

于 2013-05-13T16:52:24.703 回答
0

“标点符号”一词相当模糊。该类Character提供了一个getType()方法,该方法至少映射到 Unicode 规范中定义的一些字符类别,因此这可能是最好的起点。

我建议也应用“正”逻辑(例如,所有字符和数字)而不是“负”逻辑(没有标点符号),因为测试可能要简单得多。

于 2013-05-13T16:38:21.483 回答