从字符串中过滤掉所有UTF-8标点字符和符号(例如✀✁✃✄✅✆✆✇等)的最佳和最有效的方法是什么。简单地过滤掉所有不在a-z,A-Z和0-9中的字符都不是一个选项,因为我想保留其他语言的字母(ą,ę,ó等) 提前谢谢。
答案 0 :(得分:3)
尝试使用unicode binary classifications的组合:
String fixed = value.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");
答案 1 :(得分: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
✀ =>
✁ =>
✂ =>
✃ =>
✄ =>
✅ =>
✆ =>
✇ =>
✈ =>
答案 2 :(得分: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
字母。
答案 3 :(得分:0)
术语"标点符号"相当含糊。 Character
类提供了getType()方法,该方法至少映射到Unicode规范中定义的character categories中的一些,因此这可能是最佳起点。
我建议同时申请"肯定"逻辑(例如,所有字符和数字)而不是"否定"逻辑(没有标点符号),因为测试可能要简单得多。