我有一个读取rdf n三联格式的文件。但是,我不允许使用第三方API(例如jena等。这是另一番争论)。

但基本上,我可以得到两种字符串:

<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)

}


我有一个hack ..

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


    }


我该如何解决?

最佳答案

不是我觉得您的解决方案太丑陋,而是另一种选择是

    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}(如果需要一些改进);最后可以选择是否将最后一组放在方括号内或不将其放在方括号内。

关于java - 如何解析包含RDF n三联的字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18905018/

10-12 18:29