0

Web ページを取得し、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");
                }
            }
    }
}
4

2 に答える 2

1

問題は、あなたが呼び出すことです:

x = m.end();

一致しない場合でも。while ステートメントに find() の呼び出しを組み込んで、ガード ステートメントとしても使用しないでください。

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();
    }
}

さらに、正規表現パターンを使用して HTML 解析を試みるよりも、解析ツールまたはライブラリを使用する方がおそらくより良い戦略であるという Reimeus に同意します。しかし、あなたがページの構造を知っていて、あなたが何を望んでいるのかを正確に知っている限り、あなたや私のような素早い解決策は大丈夫だと思います.

于 2012-08-11T15:33:09.400 に答える