Java:scanner - 我需要读取字母数字行,包括空格/制表符,但不能读取新行

时间:2016-06-29 17:59:37

标签: java regex java.util.scanner

我正在使用java扫描程序从System.in读取输入。我需要读取字母数字行,包括空格/制表符,但不是新行,也不应该允许空输入。

例如:

a new name

a-new-name-1

这是我的扫描仪:

Scanner reader = new Scanner(System.in);

我试过这些方法:

String name = reader.nextLine();

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

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

对于输入的最后2个案例"测试名称1" ,我有错误:

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)
............

当使用reader.nextLine()时,它会跳过等待下一个输入。例如:

对于此部分代码:

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

我看到了这一点:

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]

我可以在这里得到任何帮助吗?

2 个答案:

答案 0 :(得分:0)

您可以使用:

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

Java中没有正则表达式分隔符/

如果您使用Java 8,则可以使用\h来匹配水平空格:

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

完整代码:

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

答案 1 :(得分:0)

FOllow Jonny Henly的建议。混合了reader.next和reader.nextLine就是问题所在。