Разделитель Java в текстовом файле

#java #regex #delimiter

Вопрос:

Я пытаюсь прочитать файл txt в этом формате (заголовок не включен):

       firstname             lastname             username             password 
           John                  Doe             $1234567                 $123
           Eden                 Hask             $1234576               $12345
 

Последний логин (Eden) всегда будет работать, но не предыдущий(Джон).
По какой-то причине разделитель будет включать все детали до следующего $.
Как я должен заставить свой разделитель остановиться после пароля.

 The user name is_1234567 and the password is_123
                Eden                 Hask!

The user name is_1234576 and the password is_12345!
 

Вот весь код.

 public void login() throws FileNotFoundException{  
        File file = new File("file.txt");
        Scanner read = new Scanner(file);
        found = false;

        read.useDelimiter("(s*\$)");

        try {
            Scanner keyboard = new Scanner(System.in);
            System.out.print("Username: ");
            String username = keyboard.nextLine();
            System.out.print("Password: ");
            String passwordField = keyboard.nextLine();
            while(read.hasNext()){
                String user = read.next();
                String pass = read.next();
                System.out.println("The user name is_"   user   " and the password is_"   pass   "!n");
                    if(user.trim().equals(username) amp;amp; pass.trim().equals(passwordField)){
                        boolean found = true;
                        break;  
                    }        
                }
             if(found){
                return true;
             }
             else {
                return false;
             }
            read.close();
        }catch(Exception e){
            throw e;
        }
    };
 

Комментарии:

1. Почему бы просто не использовать вкладки («t») для разделения полей?

Ответ №1:

Я бы сделал это совершенно по-другому:

 boolean found;
    public void login() throws FileNotFoundException {
        File file = new File("file.txt");
        Scanner read = new Scanner(file);

        try {
        Scanner keyboard = new Scanner(System.in);
        System.out.print("Username: ");
        String username = keyboard.nextLine();
        System.out.print("Password: ");
        String password = keyboard.nextLine();
        
        // Skip the first line
        read.nextLine();
        
        while (read.hasNextLine()) {
            String line = read.nextLine();
            //split current line with spaces into an array
            String[] lineArray = line.split("\s ");
            String user = lineArray[1];
            String pass = lineArray[4];
            System.out.println("The user name is "   user   " and the password is "   pass   "!n");
            if (user.equals(username) amp;amp; pass.equals(password)) {
                found = true;
                break;
            }
        }
        read.close();
        keyboard.close();
        
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 

Ответ №2:

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

 read.useDelimiter("n|(s*\$)")
 

это должно предотвратить включение всех предыдущих строк «пароля» в сведения из следующей строки

Ответ №3:

В дополнение к включению разрыва строки в разделитель, вы можете прочитать имя пользователя, чтобы синхронизировать чтение идентификатора пользователя/пароля:

     read.useDelimiter("(\s*\$)|(\R)");

    try {
        Scanner keyboard = new Scanner(System.in);
        System.out.print("Username: ");
        String username = keyboard.nextLine();
        System.out.print("Password: ");
        String passwordField = keyboard.nextLine();
        while(read.hasNext()){
            String name = read.next();
            String user = read.next();
            String pass = read.next();