Разбор строки, файл грамматики - PullRequest
1 голос
/ 09 марта 2010

Как бы я разделить строку ниже на ее части. То, что мне нужно отделить, - это каждый , включая угловые скобки, от остальной части строки. Таким образом, в приведенном ниже случае я получу несколько строк 1. «Я должен расстаться с вами, потому что» 2. «<причина>» (без пробелов) 3. «. Но давайте все же« 4. »<отказ от ответственности> "5.". "

I have to break up with you because <reason> . But let's still <disclaimer> .

ниже - это то, что у меня сейчас есть (уродливо ...)

boolean complete = false;
    int begin = 0;
    int end = 0;
        while (complete == false) {
        if (s.charAt(end) == '<'){
            stack.add(new Terminal(s.substring(begin, end)));
            begin = end;
        } else if (s.charAt(end) == '>') {
            stack.add(new NonTerminal(s.substring(begin, end)));
            begin = end;
            end++;
        } else if (end == s.length()){
            if (isTerminal(getSubstring(s, begin, end))){
                stack.add(new Terminal(s.substring(begin, end)));
            } else {
                stack.add(new NonTerminal(s.substring(begin, end)));
            }
            complete = true;
        }
        end++;

Ответы [ 3 ]

1 голос
/ 09 марта 2010

Посмотрите на использование StringTokenizer

0 голосов
/ 09 марта 2010

На самом деле использование BreakIterator было бы лучшим способом сделать это.

Класс BreakIterator также обеспечивает статический getCharacterInstance (), getWordInstance и getLineInstance () методы. Эти методы возвращают Экземпляры BreakIterator, которые позволяют вам разобрать по характеру, слову и уровень линии соответственно.

0 голосов
/ 09 марта 2010

Используйте регулярное выражение.

for (String token : text.split("(?=<)|(?<=>)")) {
    boolean isNT = token.startsWith("<");
    System.out.format("%s |%s|%n", isNT ? "NT" : " T", token);
}
...