2017-02-19 4 views
3

Я прочитал здесь, как разделить данные из строки, и это сработало чудесами ... по большей части.Разделение данных из строки

То, что я пытаюсь сделать, это извлечь данные из файла учетных данных с четырьмя разделами в строке, разделенной пробелами, именем пользователя, хешем MD5, обычным текстовым паролем, окруженным в "и, наконец, ролью. Я начал использовать .split, думая, что это будет то, что мне нужно, но этот третий или [2] элемент иногда имеет пространство в нем, которое мне нужно каким-то образом фильтровать в раскол. Любые идеи?

Пример линия, которая разбивается от credentialLine:

griffin.keyes 108de81c31bf9c622f76876b74e9285f "алфавит суп" Zookeeper

FileInputStream credentialsFile = null; 
    Scanner inFS = null; 
    String credFile = ".\\src\\authenticationsystem\\credentials.txt"; 

    System.out.println("\nOpening file credentials.txt"); 

    credentialsFile = new FileInputStream(credFile); 
    inFS = new Scanner(credentialsFile); 
    String credentialLine = inFS.nextLine(); 
    System.out.println(credentialLine); 
    System.out.println("Closing file credentials.txt\n"); 
    credentialsFile.close(); 

    String[] userCreds = credentialLine.split("\\s+"); 
    String userCred = userCreds[0]; 
    String userMD = userCreds[1]; 
    String userPass = userCreds[2]; 
    String userRole = userCreds[3]; 

ответ

2

Вам нужно будет использовать регулярное выражение, которое игнорирует некоторые пробелы. Из примера, который вы указали, кажется, что пространство, которое вы хотите игнорировать, находится внутри кавычек.

Если это имеет место для всех значений, которые вы можете использовать что-то вроде этого:

String[] userCreds = credentialLine.split("((?!\"[^\" ]+)\\s+(?![^ \"]+\"))"); 

((?!\"[^\" ]+) означает: убедитесь, что это не цитата по под паром последовательности символов (другой тогда пространство или цитировать) до/после одного или нескольких пробелов.

+0

Не будьте так быстро на этом. Он не работает, если в текстовом пароле есть ** пробел **. В конце концов, только изредка там есть место. – DevilsHnd

+0

Я получил нижеследующее исключение в потоке «main» java.lang.ArrayIndexOutOfBoundsException: 3 \t at authenticationsystem.AuthenticationSystem.main (AuthenticationSystem.java:48) C: \ Users \ Anna \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml: 53: Java возвращается: 1 BUILD FAILED (общее время: 2 секунды) – Ghostey

+0

@DevilsHnd Вы правы, я не думал об этом. – Titus

0
String stringToSearch = "griffin.keyes 108de81c31bf9c622f76876b74e9285f \"alphabet soup\" zookeeper"; 

Pattern p1 = Pattern.compile("(?:[^\" ]+|\"[^\"]+\")+"); 
Matcher m = p1.matcher(stringToSearch); 
while (m.find()) 
{ 
    System.out.println(m.group()); 
} 

When it encounters qutoes, the group alternates to the right hand side, which matches everything between the quotes, and returns to the left hand side for matching everything up to the next space. 
Смежные вопросы