0

rdf n-triples 形式を読み取るファイルがあります。ただし、サードパーティの API を使用することは許可されていません (jena など... これは別の議論です)。

しかし、基本的には、次の 2 種類の文字列を取得できます。

<foo 1> <bar 1> <foo bar> .
<foo 2> <bar 2> foobar .

だから、私はクラスを書きたい:

void ParseTriples(String s){
   setObject(<foo> part)
   setPredicate(<bar part>)
   setObject(<foobar> or foobar)

}

私が持っているのはハックです..

public void setNTriples(String text){
        Pattern pattern = Pattern.compile("<(.*?)>");
        //Pattern pattern = Pattern.compile("<([^>]*)>\\s+[<]?([^>]*)[>]?");
        //Pattern pattern = Pattern.compile("(<[a-zA-Z.\\d\\s]+>|\\w+)");
        Matcher matcher = pattern.matcher(text);
        int count = 0;
        int end = 0;
        int totalLength = text.length();
        while(matcher.find()) {
            if (count == 0){
                //System.out.println(matcher.group(1));
                setSubject(new Text(matcher.group(1)));
                //length += getSubject().toString().length();
                //System.out.println(length);
                count +=1;
            }
            else if (count == 1){


                setPredicate(new Text(matcher.group(1)));
                count +=1;

                end = matcher.end();
            }
            else if (count == 2){
                //System.out.println(matcher.group(1));
                setObject(new Text(matcher.group(1)));
                count +=1;
                //System.out.println(text.substring(length+5, totalLength));
            }

        }
        //System.out.println(count);
        // ugly hack
        if (count == 2){
            setObject(new Text(text.substring(end+1,totalLength-2)));
        }


    }

これを修正するにはどうすればよいですか?

4

1 に答える 1

4

あなたのソリューションが醜すぎるとは思いませんが、別のオプションは

    Pattern pattern = Pattern.compile("^(?:<([^>]+)>\s*){2}<?([^>]+)>?$");  
    Matcher matcher = pattern.matcher(text);
    if (matcher.matches()) {
       return new Triple(matcher.group(1), matcher.group(2), matcher.group(3));
    } else{
       // error handling code
    }

編集:コンパイルされていません(手元にJREはありません)が、構文は?:2回繰り返されるキャプチャされていないグループを説明しています{2}(何らかの改良が必要な場合)。最後に、括弧内またはなしで最後のグループを取得するオプションです。

于 2013-09-19T21:20:07.973 に答える