2013-09-19 1 views
0

У меня есть файл, который читает формат rdf n-triples. Но мне не разрешено использовать сторонние API (например, jena и т. Д.). Это разные дебаты).Как разобрать строку, содержащую n-тройки RDF?

Но в принципе, я могу получить два вида строки:

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


    } 

Как это исправить?

+0

Какой результат вы пытаетесь достичь? –

+1

Просто используйте регулярное выражение для '^ <([^>] +)> \ s + <([^>] +)> \ s + ] +)>? $' Вместо этого? http://www.debuggex.com/r/sSJBdZuSTtL-4JpB –

+1

Итак, вы пытаетесь написать парсер rdf, и по какой-то причине вы не можете просто использовать сторонний парсер? –

ответ

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 
    } 

Edit: Не компилируется (нет JRE под рукой), но синтаксис объясняет не-захвачена группа ?:, который получает повторное 2 раза {2} (в случае необходимости уточнения); в конце есть возможность получить последнюю группу внутри скобок или без нее.

+3

примечание: во втором случае это приведет к сбою в списках OP, который не имеет угловых скобок в третьем члене. –

+0

@ Mike'Pomax'Kamermans да, я пропустил разницу между двумя строками, надеюсь, что теперь я больше ничего не пропустил. Спасибо. – SJuan76

+0

@ SJuan76: В конце есть точка :) – Fraz