Java 正则表达式中的懒惰匹配

最近在搞一个手机应用,其中一部分涉及到了webservice,由于webservice这部分也是自己做,所以在取回数据的时候,需要自己解析数据。

返回的数据是jason格式,关于jason格式的包应该很多了,但是由于数据不大,所以想自己写写解析部分,去年的时候做新浪微博应用,用的c++编写,解析jason是最原始的办法,自己进行字符串的匹配,由于没于语言本身没有正则表达式的支持,只能依赖与第三方库,还是因为自己懒,不想找,所以写了一个很挫很挫的解析过程,就不多说了。

String res="[{\"id\":13,\"receiveTime\":\"2013-04-20 00:00:00 星期六\",\"sensorType\":\"0 \",\"value\":\"19\"},{\"id\":14,\"receiveTime\":\"2013-04-21 00:00:00 星期日\",\"sensorType\":\"1 \",\"value\":\"20\"},{\"id\":3,\"receiveTime\":\"2013-04-14 00:00:00 星期日\",\"sensorType\":\"2 \",\"value\":\"20\"},{\"id\":4,\"receiveTime\":\"2013-04-15 00:00:00 星期一\",\"sensorType\":\"3 \",\"value\":\"20\"},{\"id\":15,\"receiveTime\":\"2013-04-23 00:00:00 星期二\",\"sensorType\":\"5 \",\"value\":\"21\"},{\"id\":6,\"receiveTime\":\"2013-04-16 00:00:00 星期二\",\"sensorType\":\"6 \",\"value\":\"20\"},{\"id\":7,\"receiveTime\":\"2013-04-17 00:00:00 星期三\",\"sensorType\":\"7 \",\"value\":\"22\"},{\"id\":8,\"receiveTime\":\"2013-04-18 00:00:00 星期四\",\"sensorType\":\"8 \",\"value\":\"32\"},{\"id\":9,\"receiveTime\":\"2013-04-19 00:00:00 星期五\",\"sensorType\":\"9 \",\"value\":\"21\"},{\"id\":10,\"receiveTime\":\"2013-04-19 00:00:00 星期五\",\"sensorType\":\"10\",\"value\":\"15\"},{\"id\":11,\"receiveTime\":\"2013-04-19 00:00:00 星期五\",\"sensorType\":\"11\",\"value\":\"20\"},{\"id\":12,\"receiveTime\":\"2013-04-20 00:00:00 星期六\",\"sensorType\":\"12\",\"value\":\"18\"}]; }";
		Pattern values=Pattern.compile("\"receiveTime\":\"(.*?)\",(.*?)\"value\":\"(\\d+)\"\\}");		
    	Matcher matchr = values.matcher(res);
    	while(matchr.find())
    	{
    		System.out.println(matchr.group(1));   		
    		System.out.println(matchr.group(3));    	
    	}

如代码中所示,这些数据是从传感器中读去然后由webservice返回,我的任务就是将每一个传感器的时间和数据取回来。

在网上找了半天关于java惰性匹配的资料,百度了半天也没找到一个有用的,说什么在Pattern.compile("****/g"),在正则的最后加上一个“/g”,在php里边的确可以,但是在java里不行了,谷歌了一下,马上就找到了正确的方法是在匹配的时候加上一个?

这个是要解析的一条数据:

{"id":13,"receiveTime":"2013-04-20 00:00:00 星期六","sensorType":"0 ","value":"19"},

上边的代码while循环每一次可以匹配到这么一条信息,如果把正则括号里的?去掉,那么就会直接默认贪心匹配到整个字符串的末尾,不是我们需要的。

Pattern.compile("\"receiveTime\":\"(.*?)\",(.*?)\"value\":\"(\\d+)\"\\}");

第一个括号会匹配时间,第二个会匹配到"sensorType":"0 ",(注意这里也必须用?来进行懒惰匹配,否则依然会匹配到字符串末尾),然后第三个会匹配数字,这样就拿到了我们所需要的东西了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值