import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test { /**
 * @param args
 */
public static void main(String[] args) { String url="http://v.tom.com/v_show/id_XxxxxxzE1MTY4.html";
String patternStr = "id_(.*)\\.html";
Pattern pattern = Pattern.compile(patternStr) ;
Matcher matcher = pattern.matcher(url);
String idStr = matcher.group(1);
System.out.println(idStr);
}}
应该可以匹配的啊,肿么老是报错?
Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:468)
at org.video.spider.Test.main(Test.java:17)

解决方案 »

  1.   

    如果我分析的不错的话
    String patternStr = "id_(.*)\\.html";
    改成
    String patternStr = "id_(.*?)\\.html";
    应该就没问题了。
      

  2.   

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class Test5 {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
     
            String url="http://v.tom.com/v_show/id_XxxxxxzE1MTY4.html";
            String patternStr = "id_(.*)\\.html";
            Pattern pattern = Pattern.compile(patternStr) ;
            Matcher matcher = pattern.matcher(url);
            while(matcher.find()){
                String idStr = matcher.group(1);
                System.out.println(idStr);
            }
        }
     
    }>javac -encoding UTF-8 Test5.java
    >Exit code: 0    Time: 1.766
    >java -cp . Test5
    XxxxxxzE1MTY4
    >Exit code: 0    Time: 0.626
      

  3.   

    喵的为何必须加while呢?
    不加,为何报错呢:(
    好神奇啊
      

  4.   

    不神奇,关键不是while,而是matcher.find(),只有执行了matcher.find()之后,指针才会指向你找到的地方,group才能够取到。
      

  5.   

    这个应该这么理解。matcher对象确实是正则匹配对象。他group(1)也是去获取捕获到的第一个组。这里你只是定义了matcher。还没有去执行find()自然就找不到group(1)。
    这就好比你买了一台电脑(就相当于你定义的这个matcher对象)。电脑确实有很多很全面的功能。
    但是你要用他至少得开机吧。你都没开机怎么用啊(相当于你没调用它的find())。
      

  6.   

    喵的,为何要在while里执行find呢?
    难道要开好多次机么?
    碉堡了:(
      

  7.   

    因为执行一次find就是找到第一次出现匹配的地方。用while就是为了让正则搜索到所有出现匹配的地方。
      

  8.   

    喵的,Java为何搞这么麻烦?
    直接把匹配放在一个ArrayList里返回过来不行么:(
      

  9.   

    这不是麻烦。利用Pattern和Matcher来做处理的。不是光光为了匹配的。你都没看Matcher里面有多少的方法吗。
    那些方法都是非常有用的。因为你的正则中可能分了好几组。你要在找到的情况下你要返回什么程序是不知道的。
    当然不可能用一个ArrayList返回了。站在需求的角度去考虑就明白了