使用java matcher类时的illegalStateException

时间:2012-08-11 14:39:41

标签: java regex pattern-matching web-crawler

我正在尝试获取一个网页,将其加载到字符串构建器中,使用BufferedReader,然后使用正则表达式查找和检索单词,或者在这种情况下使用单词组(部门名称,如计算机科学,电气工程)等。)匹配正则表达式模式。我正在使用java提供的Pattern和Matcher类,但是遇到了一个illegalStateException。我已经盯着这段代码了很长一段时间,并想对问题可能是什么有一些新的看法。我知道它与 m.find() m.group()方法有关。任何帮助将不胜感激。

我想从我得到的输出中,它识别出匹配正则表达式的第一个单词,然后开始抛出illegalStateException。

我还在下面发布了我的代码:

public class Parser{

    static StringBuilder theWebPage;
    ArrayList<String> courseNames;
    //ArrayList<parserObject> courseObjects;

    public static void main(String[] args) 
    {
        Parser p = new Parser();

        theWebPage = new StringBuilder();
        try {
                URL theUrl = new URL("http://ocw.mit.edu/courses/");
                BufferedReader reader = new BufferedReader(new InputStreamReader(theUrl.openStream()));
                String str = null;

                while((str = reader.readLine())!=null)
                {
                    theWebPage.append(" ").append(str);
                    //System.out.println(theWebPage);
                }
                //System.out.println(theWebPage);
                reader.close();

            } catch (MalformedURLException e) {
                System.out.println("MalformedURLException");

            } catch (IOException e) {
                System.out.println("IOException");
            }

        p.matchString();
    }

    public Parser()
    {
        //parserObject courseObject = new parserObject();
        //courseObjects = new ArrayList<parserObject>();
        courseNames = new ArrayList<String>();
        //theWebPage=" ";
    }

    public void matchString() 
    {
        String matchRegex = "#\\w+(-\\w+)+";
        Pattern p = Pattern.compile(matchRegex);
        Matcher m = p.matcher(theWebPage);
        int i=0;
        int x=0;
        //m.reset();

            while(!(m.matches()))
            {
                System.out.println("inside matches method " + i);
                try{

                        m.find();
                     x = m.end();
                    System.out.println( m.group());
                    PrintStream out = new PrintStream(new FileOutputStream("/Users/xxxx/Desktop/output.txt"));
                    System.setOut(out);

                    //courseNames.add(i,m.group());

                    i++;
                }catch(IllegalStateException e)
                {
                    System.out.println("IllegalStateException");
                } catch (FileNotFoundException e) {
                    System.out.println("FileNotFound Exception");
                }
            }
    }
}

2 个答案:

答案 0 :(得分:1)

问题是你打电话:

x = m.end();

即使你可能没有匹配。为什么不将对find()的调用合并到while语句中,从而使它成为一个保护语句:

while (m.find()) {

答案 1 :(得分:0)

您的解决方案过度复杂化了一些事情。怎么样?

package MitOpenCourseWareCrawler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Parser {
    private List<String> courseNames = new ArrayList<String>();
    private URL url;

    public Parser(String url) throws MalformedURLException {
        this.url = new URL(url);
    }

    public static void main(String[] args) throws IOException {
        Parser parser = new Parser("http://ocw.mit.edu/courses/");
        parser.parse();
        for (String courseName : parser.courseNames)
            System.out.println(courseName);
    }

    public void parse() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
        Pattern pattern = Pattern.compile(".*<u>(.+)</u>.*");
        Matcher matcher;
        String line;
        while ((line = reader.readLine()) != null) {
            matcher = pattern.matcher(line);
            if (matcher.matches())
                courseNames.add(matcher.group(1));
        }
        reader.close();
    }
}

此外,我同意Reimeus的观点,使用解析工具或库可能比尝试使用正则表达式模式进行HTML解析更好。但我想只要你知道页面的结构并确切地知道你想要什么,像你或我这样的快速解决方案是可以的。