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

来源:互联网 发布:淘宝买家信誉度查询 编辑:程序博客网 时间:2024/05/29 11:01

最近在搞一个手机应用,其中一部分涉及到了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 ",(注意这里也必须用?来进行懒惰匹配,否则依然会匹配到字符串末尾),然后第三个会匹配数字,这样就拿到了我们所需要的东西了。

原创粉丝点击