前言:最近项目中客户要求只保留文本中的字母部分,比如将处理文本 [ 文本你 好 呀, PL-g;'.*o,o 121“‘2ds -> 你好呀PLgoods ]。使用如下Java代码可以达成目的,但是对于\\PL+这种非常规的正则表达式比较陌生,那么如果延伸下需求,比如要去除文本中的数字符号、货币符号、标点符号以及控制字符等可能就无能为力,始终停留在知其然而不知其所以然的状态。本人通过查阅资料结合个人理解整理成本篇博客,目标是记录下这种正则的本质,提供一种新的方式或手段来达成文本处理目的;
public static void main(String[] args) throws IOException {
String contents = "你 好 呀, PL-g;'.*o,o 121“‘2ds";
contents = contents.replaceAll("\\PL+","");
System.out.println(contents);
}
1.1 unicode字符常识
首先明确一点计算机中显示的任何一个能正常显示的符号都算作一个unicode字符,unicode字符涵盖了各语言区域下出现的字母、数字、标点、空格换行、货币符号等;日常我们提及到unicode字符,更多地关注unicode字符编码(code point),其实与正则相关的还有另外三个属性:分别为Unicode Property、Unicode Block、Unicode Script。我们可以通过以下图片加强下认知,可以发现unicode字符的这三个属性分别从三个不同的角度来描述unicode字符
1.2 Unicode Block
按照编码去接划分Unicode字符,每个Unicode字符都有唯一归属的Unicode Block,各个区间彼此联系但互不相交;一般情况下同一种语言的字符通常落在同一区间内,所以Unicode Block可以粗略地表示某类语言的字符,可以通过Unicode块来查看详细的Block划分&