首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程
在对安全日志信息的分析过程中,我们经常需要利用正则表达式提取重要的字段信息,而中文就成为正则表达式绕不过去的一道坎。
以“8个文件”作为测试字符串,依次做出匹配与字段提取操作。
方法一:区段匹配
众所周知,JAVA支持对Unicode字符的解析,请看清楚,是Unicode字符,不是UTF-8编码(只有在字节码中,才会转为UTF-8形式),于是我们可以使用Unicode指定字符的区间范围4E00到9FA5,如下:
String testTxt = "8个文件";// 注意[\u4E00-\u9FA5]里面的斜杠字符,千万不可省略,不区分大小写Pattern pat = Pattern.compile("^(\\d+)[\u4E00-\u9FA5]{3}$");Matcher mat = pat.matcher(testTxt);if(mat.matches()) { System.out.println(mat.group(1));}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
在[]中指定的都是字符,所以只需要一个斜杠字符,注意千万不可省略。
在上面的匹配过程中,中文字符只指定了一个范围,所以导致难以精确匹配,例如我需要匹配的是“目录”,而不是“文件”。
方法二:中文字符直接匹配
我们已经在字节码中证明过了,无论JAVA文件是GBK编码,还是UTF-8编码,在字节码的存储格式中,都会转为UTF-8编码,以三个字节进行存储,所以正则表达式的书写方式并不会受限与文件的编码(请注意,如果把正则表达式作为配置文件,然后作为字符串读入到内存中,那又该另当别论)。
所以,上面的正则表达式,又可以写为如下方式:
Pattern abs = Pattern.compile("(\\d+)个文件");
- 1
方式三:Unicode编码匹配
对JAVA而言,Unicode编码字符与中文字符是等价的,所以还可以写为如下形式:
Pattern abs = Pattern.compile("(\\d+)\u4e2a\u6587\u4ef6");
- 1
如何将字符转为Unicode编码,我们可以直接在命令行输入以下命令,然后输入中文即可:
# 以UI交互的方式启动命令native2ascii
- 1
- 2
以文件的方式批量处理进行转换,如下:
# encoding是指输入文件的编码方式,这里是指1.txt,千万要指定正确,否则出现错误的结果native2ascii -encoding GBK 1.txt 2.txt# 反转,这里的encoding是指输出文件的编码方式native2ascii -reverse -encoding GBK 2.txt 3.txt
- 1
- 2
- 3
- 4
结论
JAVA正则表达式对中文的支持非常友好,所以可以采用更精准的方式来获取所需要的信息,而不用使用.通配符。