在对安全日志信息的分析过程中,我们经常需要利用正则表达式提取重要的字段信息,而中文就成为正则表达式绕不过去的一道坎。
以“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)); }
在[]中指定的都是字符,所以只需要一个斜杠字符,注意千万不可省略。
在上面的匹配过程中,中文字符只指定了一个范围,所以导致难以精确匹配,例如我需要匹配的是“目录”,而不是“文件”。
方法二:中文字符直接匹配
我们已经在字节码中证明过了,无论JAVA文件是GBK编码,还是UTF-8编码,在字节码的存储格式中,都会转为UTF-8编码,以三个字节进行存储,所以正则表达式的书写方式并不会受限与文件的编码(请注意,如果把正则表达式作为配置文件,然后作为字符串读入到内存中,那又该另当别论)。
所以,上面的正则表达式,又可以写为如下方式:
Pattern abs = Pattern.compile("(\\d+)个文件");
方式三:Unicode编码匹配
对JAVA而言,Unicode编码字符与中文字符是等价的,所以还可以写为如下形式:
Pattern abs = Pattern.compile("(\\d+)\u4e2a\u6587\u4ef6");
如何将字符转为Unicode编码,我们可以直接在命令行输入以下命令,然后输入中文即可:
# 以UI交互的方式启动命令 native2ascii
以文件的方式批量处理进行转换,如下:
# encoding是指输入文件的编码方式,这里是指1.txt,千万要指定正确,否则出现错误的结果 native2ascii -encoding GBK 1.txt 2.txt # 反转,这里的encoding是指输出文件的编码方式 native2ascii -reverse -encoding GBK 2.txt 3.txt
结论
JAVA正则表达式对中文的支持非常友好,所以可以采用更精准的方式来获取所需要的信息,而不用使用.通配符。
今天的文章
java正则匹配中文和英文_java正则表达式教程分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89816.html