【问题标题】:Java Scanner hasNext() string regex validationJava Scanner hasNext() 字符串正则表达式验证
【发布时间】:2016-07-30 21:25:50
【问题描述】:

我正在尝试使用 Scanner System.in 函数来尝试使用 Java 正则表达式来验证用户输入。我要验证的是一个用户输入,它只能包含字母作为输入,并且可以包含多个单词。如果我输入例如(“Test1”)它会抛出一条消息,警告我必须只输入字母,并提示再次输入,但是如果我要输入(“Test 1”),那么它会通过我的正则表达式,似乎是空格导致了这个问题,但是在我的正则表达式中添加空格并没有解决我的问题。任何帮助将不胜感激。以下是我的代码有问题的部分:

System.out.println("Please enter the your name: ");

while(!input.hasNext("[a-zA-Z]+")){

    System.out.println("Your name must consist of only letters");
    input.nextLine();

}

String name = input.nextLine();

这对某人来说可能显然是错误的,但我是 Java 和正则表达式的新手,并且整天都在试图找出问题所在,但没有成功。

感谢您的宝贵时间。

【问题讨论】:

  • 试试^[a-zA-Z_ ]*$ 无论如何都不完美,但对于新手来说已经足够简单了。
  • 可能是^[a-zA-Z_ ]+$,所以不允许使用空字符串。

标签: java regex string expression


【解决方案1】:

您需要做的就是在[] 中添加一个空格。我还建议使用^(表示它必须是字符串的开头)和$(表示字符串的结尾):

^[a-zA-Z ]+$

您也可以使用\s 选择所有空格,例如Tab

您的完整代码:

System.out.println("Please enter the your name: ");

while(!input.hasNext("^[a-zA-Z ]+$")){
    System.out.println("Your name must consist of only letters");
    input.nextLine();
}

String name = input.nextLine();

如果你想允许像* 这样的符号,那么所有都是数字。你可以使用\d+。如果匹配,则打印出错误(您需要删除 while 语句中的 !

【讨论】:

  • 我打算提出相同的答案,但它不起作用。我用John Doe 测试了相同的代码,它会租用循环,我不知道为什么。 .
  • 我和 Maljam 有同样的问题,我整天都在尝试这个,如果存在空格,它似乎无法验证输入。仅适用于“Test1”之类的字符串,而不适用于“Test 1”,即使在 [] 中添加了空格。感谢 Druzion 的建议!
  • @ChocolateDogBone 你试过\s吗?
  • @Druzion,是的,我也尝试在我的正则表达式中使用 \\s,但没有成功,下面发布的解决方案是我现在解决这个问题的方法!
【解决方案2】:

hasNext(pattern) 将匹配下一个 complete token 与 Regex 模式。 根据此方法文档getCompleteTokenInBuffer(Pattern pattern)来自Scanner

如果被分隔符包围,则令牌是完整的;部分标记以 delims 为前缀,但不以它们为后缀。

问题在于Scanner 中的默认分隔符是空格,因为只有空格之前的字符串才会针对模式进行测试。

解决方案

Scanner scanner = new Scanner(inputStream).useDelimiter("\\R");

在上述扫描仪上调用 hasNext(pattern) 会将模式与整行匹配。

注意 模式不应匹配分隔符,在本例中为换行符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2013-02-09
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多