Текст синтаксического анализа с помощью сканера useDelimiter

Смотря на синтаксический анализ следующий текстовый файл:
Демонстрационный текстовый файл:

<2008-10-07>text entered by user<Ted Parlor><2008-11-26>additional text entered by user<Ted Parlor>

Я хотел бы проанализировать вышеупомянутый текст так, чтобы у меня могло быть три переменные:

v1 = 2008-10-07
v2 = text entered by user
v3 = Ted Parlor
v1 = 2008-11-26
v2 = additional text entered by user
v3 = Ted Parlor

Я попытался использовать сканер и useDelimiter, однако, у меня есть проблема о том, как настроить это, чтобы иметь результаты как указано выше. Вот моя первая попытка:

import java.io.*;
import java.util.Scanner;

public class ScanNotes {
    public static void main(String[] args) throws IOException {
        Scanner s = null;
        try {
            //String regex = "(?<=\\<)([^\\>>*)(?=\\>)";
            s = new Scanner(new BufferedReader(new FileReader("cur_notes.txt")));
            s.useDelimiter("[<]+");

            while (s.hasNext()) {
                String v1 = s.next();
                String v2= s.next();
                System.out.println("v1= " + v1 + " v2=" + v2);
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }
}

Результаты следующие:

v1= 2008-10-07>text entered by user v2=Ted Parlor> 

То, чего я требую:

v1= 2008-10-07 v2=text entered by user v3=Ted Parlor
v1= 2008-11-26 v2=additional text entered by user v3=Ted Parlor

Любая справка, которая позволила бы мне извлекать все три строки отдельно, будет значительно цениться.

5
задан skaffman 15 May 2011 в 13:00
поделиться

1 ответ

Вы можете использовать \s*[<>]\s* в качестве разделителя. То есть, любое из < или >, с любыми предшествующими и последующими пробелами.

Чтобы это работало, во входных данных не должно быть никаких < или >, кроме тех, которые используются для обозначения полей даты и пользователя во входных данных (т.е. никаких I <3 U!!! в сообщении).

Этот разделитель допускает пустые части строк в записи, но он также оставляет пустые лексемы строк между любыми двумя записями, поэтому их нужно отбрасывать вручную.

import java.util.Scanner;

public class UseDelim {
    public static void main(String[] args) {
        String content = " <2008-10-07>text entered by user <Ted Parlor>"
        + "   <2008-11-26>  additional text entered by user <Ted Parlor>"
        + "   <2008-11-28><Parlor Ted>  ";
        Scanner sc = new Scanner(content).useDelimiter("\\s*[<>]\\s*");
        while (sc.hasNext()) {
            System.out.printf("[%s|%s|%s]%n",
                sc.next(), sc.next(), sc.next());

            // if there's a next entry, discard the empty string token
            if (sc.hasNext()) sc.next();
        }
    }
}

Это печатает:

[2008-10-07|text entered by user|Ted Parlor]
[2008-11-26|additional text entered by user|Ted Parlor]
[2008-11-28||Parlor Ted]

См. также

7
ответ дан 14 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: