JAVA总结(四):正则表达式匹配中文的三种方法

在对安全日志信息的分析过程中,我们经常需要利用正则表达式提取重要的字段信息,而中文就成为正则表达式绕不过去的一道坎。

以“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正则表达式对中文的支持非常友好,所以可以采用更精准的方式来获取所需要的信息,而不用使用.通配符。

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值