一 背景
实际开发中,经常需要剔除字符串中的一些符号,如果直接定义在代码中,会显得代码比较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