Смотря на синтаксический анализ следующий текстовый файл:
Демонстрационный текстовый файл:
<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
Любая справка, которая позволила бы мне извлекать все три строки отдельно, будет значительно цениться.
Вы можете использовать \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]