0

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

我会从我得到的输出中说,它识别出与正则表达式匹配的第一个单词,然后开始抛出非法状态异常。

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

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");
                }
            }
    }
}
4

2 回答 2

1

问题是你打电话:

x = m.end();

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

while (m.find()) {
于 2012-08-11T14:59:36.787 回答
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 更好。但我想只要你知道页面的结构并且确切地知道你想要什么,像你或我这样的快速'n'dirty 解决方案就可以了。

于 2012-08-11T15:33:09.400 回答