JAVA总结(四):正则表达式匹配中文的三种方法
来源:互联网 发布:信息技术考试软件 编辑:程序博客网 时间:2024/06/16 06:19
在对安全日志信息的分析过程中,我们经常需要利用正则表达式提取重要的字段信息,而中文就成为正则表达式绕不过去的一道坎。
以“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正则表达式对中文的支持非常友好,所以可以采用更精准的方式来获取所需要的信息,而不用使用.通配符。
阅读全文
0 0
- JAVA总结(四):正则表达式匹配中文的三种方法
- JAVA总结(四):正则表达式匹配中文的三种方法
- java中匹配中文的正则表达式
- java匹配中文汉字的正则表达式
- java 正则表达式匹配中文
- JAVA总结(五):多行匹配正则表达式的两种解析方法
- 匹配中文的正则表达式
- 匹配中文的正则表达式
- 正则表达式的中文匹配
- Java正则表达式 匹配中文字符
- java使用正则表达式(regex)匹配中文
- 正则表达式匹配中文
- 正则表达式 匹配中文
- 正则表达式匹配中文
- 正则表达式匹配中文
- 正则表达式匹配中文
- 正则表达式匹配中文
- 中文正则匹配,匹配中文,正则表达式
- 深入理解javascript原型和闭包(2)——函数和对象的关系
- MySQL优化的一些建议
- 解决The current branch is not configured for pull No value for key branch.master.merge found in config
- 在Spring3中使用注解(@Scheduled)创建计划任务
- SQL Server查看所有表大小,所占空间
- JAVA总结(四):正则表达式匹配中文的三种方法
- Android Studio打包和gradle配置构建
- [HDU](1849)Rabbit and Grass ---Nim博弈(博弈)
- Tomcat 9 安装运行
- HTML5游戏开发之 -- lufylegend. js猜拳游戏(竖屏)
- Unity3D4.* NGUI制作动态字库
- python import sys sys.path.append()
- 分页概念
- 解决Fiddler "creation of the root certificate was not successful”的问题