2016-06-29 4 views
-1

Ich benutze Java-Scanner, um Eingaben von System.in zu lesen. Ich muss die alphanumerische Zeile einschließlich Leerzeichen/Tab lesen, aber nicht die neue Zeile und sollte auch keine leere Eingabe zulassen.Java: Scanner - Ich brauche alphanumerische Zeile einschließlich Leerzeichen/Tab aber keine neue Zeile lesen

Zum Beispiel:

a new name 

oder

a-new-name-1 

Hier ist mein Scanner:

Scanner reader = new Scanner(System.in); 

Ich habe versucht, diese Möglichkeiten:

String name = reader.nextLine(); 

oder

String name = reader.next("^[A-Za-z0-9- ]+$"); 

oder

name = reader.next("/^[a-z\\d\\-_\\s]+$/i"); 

Für letzte 2 Fälle mit dem Eingang "ein Testnamen 1", hatte ich Fehler:

Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.next(Scanner.java:1418) 
............ 

Und wenn verwendet reader.nextLine(), es wird übersprungen und auf die nächste Eingabe gewartet. Zum Beispiel:

Für diesen Teil des Codes:

Do you want to update audience name?[y/n] 
y 
Enter audience name : 
Do you want to update audience description?[y/n] 
y 
Enter audience description : 
Do you want to update audience rule?[y/n] 

Darf ich jede Hilfe hier:

System.out.println("Do you want to update audience name?[y/n]"); 
opt = reader.next().trim(); 

if(opt.equalsIgnoreCase("y")) 
{ 
    System.out.println("Enter audience name : "); 
    name = reader.nextLine(); 
} 

System.out.println("Do you want to update audience description?[y/n]"); 
opt = reader.next().trim(); 

if(opt.equalsIgnoreCase("y")) 
{ 
    System.out.println("Enter audience description : "); 
    description = reader.nextLine(); 
} 

ich das sehe?

+0

reader.nextLine() bricht Sätze automatisch um \ n. Warum reader.nextLine() arbeitet nicht an Ihrem Fall? – CSK

+0

Mögliches Duplikat von [Überspringt nextLine() nach der Verwendung von next(), nextInt() oder anderen nextFoo() Methoden] (http://stackoverflow.com/questions/13102045/skipping-nextline-after-using-next-nextint- or-other-nextfoo-Methoden) –

+0

Warum setzt man 'opt' nicht auf' reader.nextLine(). trim() '? Warum nennst du 'reader.next()', nimm einfach die ganze Zeile.Ihr Problem besteht darin, dass das Zeilenumbruchzeichen nicht im 'System.in' -Puffer verbraucht wird. Wenn Sie also' description = reader.nextLine() 'aufrufen, wird' description' auf das gesetzt, was noch im 'System 'ist. in' Puffer. –

Antwort

0

folgen Jonny Henly Vorschlag. Eine Mischung aus reader.next und reader.nextLine war das Problem.

0

Sie können diese verwenden:

String name = reader.next("^[\\w\\p{Space}-]+$"); 

gibt es keine regex Begrenzer / in Java.

Wenn Sie mit Java 8 dann können Sie \h verwenden horizontal Leerzeichen zum Spiel:

String name = reader.next("^[\\w\\h-]+$"); 

Voll Code:

Scanner reader = new Scanner(System.in); 
reader.useDelimiter("\\R"); 
while(!reader.hasNext("^[\\w\\h-]+$")) { 
    System.out.println("Only enter letters, numbers, hyphen, underscore or whitespace"); 
    reader.next(); 
} 
String name = reader.next(); 
System.out.println("valid Input: " + name);  
reader.close(); 

Working Code Demo

+0

Publikum Namen eingeben: ein neuer Name Aud 1 Exception in thread "main" java.util.InputMismatchException \t bei java.util.Scanner .throwFor (Scanner.java:864) \t bei java.util.Scanner.next (Scanner.java:1485) \t bei java.util.Scanner.next (Scanner.java:1418) – Patty

+1

Die Regex sollte keine Rolle spielen . OP nimmt das neue Zeilenzeichen im 'System.in'-Puffer vor dem Aufruf von 'Scanner # nextLine()' nicht auf. –

+0

@Patty: Überprüfen Sie meine aktualisierte Antwort mit vollem Code. Sie müssen 'reader.useDelimiter (" \\ R ") verwenden;' wenn Sie Java8 oder 'reader.useDelimiter (" [\\ r \\ n] ") verwenden;' – anubhava