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