搜索

首页  >  问答  >  正文

Java写爬虫的时候,matcher.groupCount()返回为1,但是matcher.group(1)却抛异常

bVFkzX.png

高洛峰高洛峰2955 天前600

全部回复(1)我来回复

  • 三叔

    三叔2016-11-10 13:52:07

    我模仿了题意,写了测试代码,结果如下

    String html = "

    mytextvalue
    "; Matcher m = Pattern.compile("

    (.*?)
    ").matcher(html); System.out.println(m.find()); //true System.out.println(m.groupCount()); //1 System.out.println(m.group(0)); //

    mytextvalue
    System.out.println(m.group(1)); //mytextvalue

    另外

    // where does m.groupCount come from
    m = Pattern.compile("(group1)(group2)(group3)").matcher(html);
    System.out.println(m.groupCount()); //3

    增加解释说明,看源码的注释

        /**
         * Returns the number of capturing groups in this matcher's pattern.
         *
         * 

     Group zero denotes the entire pattern by convention. It is not      * included in this count.      *      * 

     Any non-negative integer smaller than or equal to the value      * returned by this method is guaranteed to be a valid group index for      * this matcher.  

         *      * @return The number of capturing groups in this matcher's pattern      */     public int groupCount() {         return parentPattern.capturingGroupCount - 1;     }

    这里说得清楚,groupCount返回的是正则表达式的捕获分组的数量(捕获分组和非捕获分组是另外的知识点),groupCount的结果并不能说明匹配的结果。

    要执行正则表达式匹配,需要执行find动作,看源码

        public boolean find() {
            int nextSearchIndex = last;
            if (nextSearchIndex == first)
                nextSearchIndex++;
    
            // If next search starts before region, start it at region
            if (nextSearchIndex < from)
                nextSearchIndex = from;
    
            // If next search starts beyond region then it fails
            if (nextSearchIndex > to) {
                for (int i = 0; i < groups.length; i++)
                    groups[i] = -1;
                return false;
            }
            return search(nextSearchIndex);
        }

    这样的才会给Matcher内部的成员变量groups赋值,groups[i] = -1;
    这样的之后在我们执行m.group(1)的时候我们才能获得捕获分组匹配到的内容。

    回复
    0
  • 取消回复