日期:2014-05-20  浏览次数:20650 次

小白java正则表达式遇到问题,求助啊。
本帖最后由 prog_C 于 2013-04-24 09:23:42 编辑
想解析人人好友的相关信息,特意学了一段时间的正则表达式,但还是遇到很着急的问题,求帮忙看一下:
final String friendList = "var friends=[{\"id\":422727123,\"vip\":false,\"selected\":true,\"mo\":false,\"name\":\"\u9648\u671b\u6797\",\"head\":\"http:\\/\\/hdn.xnimg.cn\\/photos\\/hdn121\\/20111020\\/2120\\/tiny_dfoU_59555d019117.jpg\",\"groups\":[]},{\"id\":123456789,\"vip\":false,\"selected\":false,\"mo\":false,\"name\":\"\u9648\u76ca\u714c\",\"head\":\"http:\\/\\/hdn.xnimg.cn\\/photos\\/hdn121\\/20130423\\/0105\\/tiny_Vhoj_f8eb00022ee4111a.jpg\",\"groups\":[]}];";
final String regex = "\"id\":(\\d{9}),\"vip\":.*\"name\":\"(.*)\",\"head\":\"(.*.jpg)\",\"";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(friendList);
int i;
while(matcher.find())
{
System.out.println("GroupCount : "+ matcher.groupCount());
System.out.println("Start : "+matcher.start());
System.out.println("End : "+matcher.end());
for(i = 0;i<=matcher.groupCount();i++)
{
System.out.println(matcher.group(i));
}
}

friedList中有两位好友的信息。
打印matcher.end()返回的值,发现是相当靠后的一个位置,问题应该是匹配过头了。尝试开启过勉强模式,但还是失败了。
求帮忙指点一下。
java基础 正则表达式 java正则

------解决方案--------------------
这是一段json串,用正则来解析应该是不合适的。
http://bbs.csdn.net/topics/390331957
这是解析json串的帖子,
楼主一定要用正则的话,其实你的那个正则匹配式效率是相当的低的。
另外楼主的匹配式子可以加一个开头和结束标记再试试
------解决方案--------------------
最简单的方式split(",")后,找到id之类的数据再split(":")
------解决方案--------------------

final String friendList = "var friends=[{\"id\":422727123,\"vip\":false,\"selected\":true,\"mo\":false,\"name\":\"\u9648\u671b\u6797\",\"head\":\"http:\\/\\/hdn.xnimg.cn\\/photos\\/hdn121\\/20111020\\/2120\\/tiny_dfoU_59555d019117.jpg\",\"groups\":[]},{\"id\":123456789,\"vip\":false,\"selected\":false,\"mo\":false,\"name\":\"\u9648\u76ca\u714c\",\"head\":\"http:\\/\\/hdn.xnimg.cn\\/photos\\/hdn121\\/20130423\\/0105\\/tiny_Vhoj_f8eb00022ee4111a.jpg\",\"groups\":[]}];";
final String regex = "\"id\":(\\d{9}),\"vip\":.*?\"name\":\"(.*?)\",\"head\":\"(.*?.jpg)\",\"";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(friendList);
int i;
while(matcher.find())
{
System.out.println("GroupCount : "+ matcher.groupCount());
System.out.println("Start : "+matcher.start());
System.out.println("End : "+matcher.end());
for(i = 0;i<=matcher.groupCount();i++)
{
System.out.println(matcher.group(i));
}
}


把你所有的.*都改成.*?就行了.
贪婪匹配改成非贪婪