最近在做一些支付报文处理工作,需要从各种各样的报文中提取需要的信息比如(金额,订单号。。。),每个渠道报文各式各样,想要写一个通用的提取逻辑,于是就回顾java正则表达式的用法。当然我们可以自己写一些算法,去提取这些字段,但对于简单的解析来说,亲自手写算法有点杀鸡用牛刀的感觉,而且正则表达式完全可以满足大部分的字符提取需求。好了闲话不多说,先列出正则表达式的常用语法:
- \:表示下一个字符为特殊含义的字符例如:\d匹配数字
- ^:表示匹配字符开始的位置例如:^#.*:匹配以#开头的所有字符
- $:表示匹配字符结束位置例如:.*元$:匹配以元为结尾的字符
- .:表示匹配所有字符
- *:表示出现次数为0,或大于0次
- +:表示出现次数为1或大于1次
- ?:表示匹配0次或1次
- {n}:标示与字符刚好匹配n次
- {n,m}:标示至少匹配n次,最多匹配m次
- [xyz]:字符集,匹配字符集中任意字符,例如:[abc] 匹配plan中的a
- [^xyz]:反向字符集,相当与非运算,表示不在字符集中的字符
- (pattern):子表达式,在java中我们自左向右取group: matcher.group(0);
下面列出一些常用的特殊字符及其含义:
- \d:匹配数字,等效于[0-9]
- \D:匹配非数字,等效于[^0-9]
- \n:匹配换行符
- \r:匹配回车符
- \s:匹配空格或者换行符或者换页符,等效于[\f\n\r\t\v]
- \S:匹配任何非空字符
- \w:匹配任何字类字符,等效于[a-zA-Z0-9]
- \W:匹配任何非字类字符
为了加深理解与运用,下面列出几个应用场景:
取出下面字符串中的金额:
#支出合计:33笔, 共10.00元
String temp = "#支出合计:33笔, 共10.00元";
Pattern p = Pattern.compile("(\\d+\\.\\d+)");
Matcher matcher = p.matcher(temp);
if(matcher.find()){
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
}
输出:10.00
发现成功的将报文中的金额识别出来,因此我们只需要将不同结构的报文中含有金额部分输入,就可以方便的输出金额了,简单的万金油....