新手在JAVA中使用正则匹配html,出现匪夷所思的事情,求大神解答

时间:2022-12-21 18:48:28
先上正则测试工具证明公式的正确性
新手在JAVA中使用正则匹配html,出现匪夷所思的事情,求大神解答
匹配到了9组
下面是java代码  运行环境是android studio
        String str = "{\"result\":\"success\",\"msg\":null,\"object\":{\"iTotalRecords\":\"9\",\"iTotalDisplayRecords\":\"9\",\"iDisplayStart\":\"0\",\"iDisplayLength\":\"-1\",\"sEcho\":\"1\",\"sSearch\":null,\"aaData\":[{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01220620\",\"kxh\":0,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"85.0\",\"pscj\":100.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":90.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"孙丰荣2\",\"jsh\":\"120128\",\"kkxsh\":\"12\",\"kcm\":\"概率统计\",\"xs\":48.0,\"xf\":3.0,\"kcsx\":\"必修\",\"kscjView\":\"90.0\",\"sycjView\":\"0.0\",\"pscjView\":\"100.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"85.0\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01221810\",\"kxh\":2,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"74\",\"pscj\":85.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":78.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"杨旭东2\",\"jsh\":\"120110\",\"kkxsh\":\"12\",\"kcm\":\"微处理器原理与应用\",\"xs\":48.0,\"xf\":3.0,\"kcsx\":\"必修\",\"kscjView\":\"78.0\",\"sycjView\":\"0.0\",\"pscjView\":\"85.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"74\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01221820\",\"kxh\":2,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"71\",\"pscj\":82.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":79.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"杨旭东2\",\"jsh\":\"120110\",\"kkxsh\":\"12\",\"kcm\":\"微处理器原理与应用实验\",\"xs\":48.0,\"xf\":1.5,\"kcsx\":\"必修\",\"kscjView\":\"79.0\",\"sycjView\":\"0.0\",\"pscjView\":\"82.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"71\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01230400\",\"kxh\":1,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"62\",\"pscj\":100.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":73.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"李涛\",\"jsh\":\"120236\",\"kkxsh\":\"12\",\"kcm\":\"电动力学\",\"xs\":48.0,\"xf\":3.0,\"kcsx\":\"必修\",\"kscjView\":\"73.0\",\"sycjView\":\"0.0\",\"pscjView\":\"100.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"62\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01230930\",\"kxh\":0,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"92\",\"pscj\":0.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":92.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"刘兆军3\",\"jsh\":\"120201\",\"kkxsh\":\"12\",\"kcm\":\"光学课程设计\",\"xs\":2.0,\"xf\":2.0,\"kcsx\":\"必修\",\"kscjView\":\"92.0\",\"sycjView\":\"0.0\",\"pscjView\":\"0.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"92\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01232210\",\"kxh\":0,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"41\",\"pscj\":30.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":71.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"戚焕筠\",\"jsh\":\"120166\",\"kkxsh\":\"12\",\"kcm\":\"应用光学\",\"xs\":32.0,\"xf\":2.0,\"kcsx\":\"必修\",\"kscjView\":\"71.0\",\"sycjView\":\"0.0\",\"pscjView\":\"30.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"41\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd01232260\",\"kxh\":0,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"76\",\"pscj\":95.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":82.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"丛振华5\",\"jsh\":\"120226\",\"kkxsh\":\"12\",\"kcm\":\"原子物理\",\"xs\":32.0,\"xf\":2.0,\"kcsx\":\"必修\",\"kscjView\":\"82.0\",\"sycjView\":\"0.0\",\"pscjView\":\"95.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"76\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd02810150\",\"kxh\":325,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"53\",\"pscj\":28.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":81.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"纪政文3\",\"jsh\":\"280001\",\"kkxsh\":\"28\",\"kcm\":\"马克思主义原理\",\"xs\":58.0,\"xf\":3.0,\"kcsx\":\"必修\",\"kscjView\":\"81.0\",\"sycjView\":\"0.0\",\"pscjView\":\"28.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"53\",\"id\":null},{\"xh\":\"201400122087\",\"xm\":\"\",\"bm\":\"电科14\",\"xsh\":\"12\",\"kch\":\"sd02910660\",\"kxh\":514,\"xnxq\":\"2015-2016-2\",\"qmcj\":\"75\",\"pscj\":0.0,\"lrzt\":\"确定\",\"sycj\":0.0,\"qzcj\":0.0,\"kscj\":75.0,\"kccj\":null,\"kssj\":\"20160627\",\"cxbkbz\":null,\"bz\":null,\"djm\":null,\"sfjscj\":\"0\",\"xsjc\":\"信息学院\",\"zczt\":\"未\",\"jsm\":\"徐剑波3\",\"jsh\":\"290023\",\"kkxsh\":\"29\",\"kcm\":\"体育(4)\",\"xs\":32.0,\"xf\":1.0,\"kcsx\":\"必修\",\"kscjView\":\"75.0\",\"sycjView\":\"0.0\",\"pscjView\":\"0.0\",\"qzcjView\":\"0.0\",\"qmcjView\":\"75\",\"id\":null}]}} " ;
        
       str =str.replace("/n","");  // 去除换行符
        str =str.replace("/r","");  // 出去回车符,这两行我不知道有没有用,先加上了
        String reg="(?<=kcm\":\")\\w+?.{0,10}(?=\",\"xs\")";  //反斜杠已经正确加上了
        RegularMatcher(str,reg);



  public void RegularMatcher(String str, String reg) {
        Pattern pat = Pattern.compile(reg,Pattern.DOTALL);
        Matcher mat = pat.matcher(str);
        boolean rs = mat.find();
        Log.d("dosome", String.valueOf(rs));
        Log.d("dosome", String.valueOf(mat.groupCount()));
        Log.d("dosome", mat.group(0));

        List<String> resultStrs = new ArrayList<String>();
        while(mat.find()){
            resultStrs.add(mat.group());
        }
        for (String string : resultStrs) {
            Log.d("dosome", string);
        }

    }

结果
rs==true;
mat.groupCount()==0;  //为什么会等于0  正则测试明明匹配到了九组
mat.group()==“概率统计”;//这个不应该是得到所有匹配到的字符串吗


Log.d("dosome", string); //如果是这个  输出的就是
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 微处理器原理与应用
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 微处理器原理与应用实验
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 电动力学
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 光学课程设计
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 应用光学
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 原子物理
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 马克思主义原理
07-19 04:50:01.351 8792-8792/com.example.an.regular_test D/dosome: 体育(4)
正好少了第一组   也就是前面mat.group()的那组


这是为什么啊,新手可能语言组织得不好,求大神解答啊,困扰了我很久了

2 个解决方案

#1


好好读一下API吧. Matcher的 group这个东西是有点奇怪的..   

#2



boolean rs = mat.find();

当你调用这一句的时候实际上已经是让match在str中的起始位置跳过了第一个了.


String regex = "(?<=\"kcm\":\")(?<course>[^\"]+)";
Matcher matcher = Pattern.compile(regex).matcher(str);
while(matcher.find()){
System.out.println(matcher.group("course"));
}

所以要获取全部的话得直接用while来循环所有或者在当你调用

boolean rs = mat.find();
的时候就线预存第一个,然后用后面的while来存储后面的匹配内容

#1


好好读一下API吧. Matcher的 group这个东西是有点奇怪的..   

#2



boolean rs = mat.find();

当你调用这一句的时候实际上已经是让match在str中的起始位置跳过了第一个了.


String regex = "(?<=\"kcm\":\")(?<course>[^\"]+)";
Matcher matcher = Pattern.compile(regex).matcher(str);
while(matcher.find()){
System.out.println(matcher.group("course"));
}

所以要获取全部的话得直接用while来循环所有或者在当你调用

boolean rs = mat.find();
的时候就线预存第一个,然后用后面的while来存储后面的匹配内容