我有一个读取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/