#java #separator
#java #разделитель
Вопрос:
Мне нужно прочитать значения, разделенные пробелами, из файла, который разделен двоеточием.
В моем файле есть эти данные —
Name : User123
DOB : 1/1/1780
Application Status : Not approved yet
Текущая реализация: я копирую все значения после разделителя (двоеточие в моем случае) в новый файл и соответственно считываю значения из нового файла.
При копировании записей в новые файловые пространства игнорируются. В приведенном выше файле «Еще не одобрено» сохраняется только как «Нет». Как я могу получить полную строку? Вот мой код —
String regex = "\b(Name |DOB | Application Status )\s*:\s*(\S )";
Pattern p = Pattern.compile(regex);
try (
BufferedReader br = new BufferedReader(new FileReader("<file to read data>"));
BufferedWriter bw = new BufferedWriter(new FileWriter("<copy the new file here>"))) {
String line;
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line);
if (m.find())
bw.write(m.group(2) 'n');
}
}
String st;
int count = -1;
String[] data = new String[100];
File datafile =new File("<new file where data is copied>");
try {
Scanner sc = new Scanner(datafile);
while(sc.hasNextLine()) {
data[ count] = sc.nextLine();
}
} catch(Exception e) {
System.out.println(e);
}
Комментарии:
1. Ваше регулярное выражение (
(\S*)
) не фиксирует «все значения» после разделителя, только первое слово. Попробуйте(.*)
вместо этого. Или просто используйтеline.split("\s*:\s*")
вместо этого.2.
String.split(":")
и некоторыеString.trim()
?
Ответ №1:
Это \S
в регулярном "\b(Name |DOB | Application Status )\s*:\s*(\S )";
выражении получает только символы, не содержащие пробелов. Таким образом, он завершается после просмотра пробела после "Not"
значения. Чтобы получить полное значение после ":"
изменения \S
, в .*
которое попадает любой символ, кроме новой строки. Таким образом, регулярное выражение становится таким "\b(Name |DOB | Application Status )\s*:\s*(.*)"
. После значения остается все пространство, поэтому перед его использованием обрежьте значение. Итак, ваш код становится таким
String regex = "\b(Name |DOB | Application Status )\s*:\s*(.*)";
Pattern p = Pattern.compile(regex);
try (BufferedReader br = new BufferedReader(new FileReader("<file to read data>"));
BufferedWriter bw = new BufferedWriter(new FileWriter("<copy the new file here>")))
{
String line;
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line);
if (m.find())
bw.write(m.group(2) 'n');
}
}
String st;
int count = -1;
String[] data = new String[100];
File datafile =new File("<new file where data is copied>");
try
{
Scanner sc = new Scanner(datafile);
while(sc.hasNextLine())
{
data[ count] = sc.nextLine().trim();
}
}
catch(Exception e)
{
System.out.println(e);
}