一 背景

实际开发中,经常需要剔除字符串中的一些符号,如果直接定义在代码中,会显得代码比较low,而且剔除的不全面。

二 原理

基于Unicode编码的规则来剔除是比较好的,Unicode编码对字符进行的分类。

例如\pP中的p表示的是property(属性)的意思,用于Unicode正则表达式的前缀,大P表示的是Unicode分类字符属性,是Unicode字符集7个字符属性之一:标点符号。

Unicode的7个字符属性如下:

P:标点符号(逗号,分号,句号等);

L:字母;
M:标记符号(一般不会单独出现);
Z:分隔符(比如空格、换行等);
S:符号(比如数学符号、货币符号等);
N:数字(比如阿拉伯数字、罗马数字等);
C:其他字符

三 代码测试

 1     public static void main(String[] args) {
 2         String s="`,.!,。?s!#!@#12 41 2;.>]] [tr哈哈哈i12321~!@~!¥#……*……ng";
 3         //P:标点字符
 4         String s0=s.replaceAll("\\pP", "");
 5         System.out.println(s0);
 6         //S:符号(比如数学符号、货币符号等)
 7         String s1=s.replaceAll("\\pS", "");
 8         System.out.println(s1);
 9         //C:其他字符
10         String s2=s.replaceAll("\\pC", "");
11         System.out.println(s2);
12         //N:数字(比如阿拉伯数字、罗马数字等)
13         String s3=s.replaceAll("\\pN", "");
14         System.out.println(s3);
15         //Z:分隔符(比如空格、换行等)
16         String s4=s.replaceAll("\\pZ", "");
17         System.out.println(s4);
18         //L:字母
19         String s5=s.replaceAll("\\pL", "");
20         System.out.println(s5);
21         //M:标记符号(一般不会单独出现)
22         String s6=s.replaceAll("\\pM", "");
23         System.out.println(s6);
24     }

结果如下:

s0:`s12 41 2> tr哈哈哈i12321~~¥ng
s1:,.!,。?s!#!@#12 41 2;.]] [tr哈哈哈i12321!@!#……*……ng
s2:`,.!,。?s!#!@#12 41 2;.>]] [tr哈哈哈i12321~!@~!¥#……*……ng
s3:`,.!,。?s!#!@# ;.>]] [tr哈哈哈i~!@~!¥#……*……ng
s4:`,.!,。?s!#!@#12412;.>]][tr哈哈哈i12321~!@~!¥#……*……ng
s5:`,.!,。?!#!@#12 41 2;.>]] [12321~!@~!¥#……*……
s6:`,.!,。?s!#!@#12 41 2;.>]] [tr哈哈哈i12321~!@~!¥#……*……ng