Чтение строкового значения с пробелами: Java

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