如何检查扫描仪输入是否包含 0-9 之间的任何数字?

How to check if scanner input contains any digit(s) from 0-9?

提问人:Abdullah El Emam 提问时间:5/15/2023 最后编辑:Arun SudhakaranAbdullah El Emam 更新时间:5/15/2023 访问量:89

问:

从本质上讲,我要求用户输入他们的名字,我试图检查他们是否在他们的名字中输入了一个数字,以便程序再次打印出“请输入你的名字”。处理这个问题非常困难(或者是例外?对不起,我是新手)。这是我到目前为止的代码:


import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.table.*;

public class scannerTrial {
    public static void main() {
        //Initializing variables
        //Setting up scanner
        Scanner inputs=new Scanner(System.in);
        String nameF="null";
        String nameL="null";
        String gender="null";
        int age=0;
        
        //Setting up digit checker
        boolean checkF=true;
        checkF=nameF.contains("0");
        checkF=nameF.contains("1");
        checkF=nameF.contains("2");
        checkF=nameF.contains("3");
        checkF=nameF.contains("4");
        checkF=nameF.contains("5");
        checkF=nameF.contains("6");
        checkF=nameF.contains("7");
        checkF=nameF.contains("8");
        checkF=nameF.contains("9");
        
        //Initiating user input
        while(!checkF) {
            System.out.println("Please type in your name.");
            nameF=inputs.nextLine();
            if(true) {
                checkF=true;
                break;
            }
        }
    }
}

我试图做的是制作一个布尔值,用于确定输入是否包含任何数字,如果它确实找到了一个数字,它将返回 true。然后,我会进入一个循环,如果布尔值为 true,那么它会循环回来,直到用户理解并返回 false,然后它突破循环。但是,出于某种原因,当我在编译程序后运行程序时,即使在键入诸如“n0”之类的内容后,程序也会退出循环。

Java 验证 java.util.scanner 数字

评论

0赞 GreenChicken 5/15/2023
因为无论输入如何,您始终将 checkF 设置为 true
1赞 Arun Sudhakaran 5/15/2023
首先,您必须在输入 之后进行数字验证,在获得 之前,您正在验证发生的情况,但它仍然是 .第二件事是检查 (literal null) 和 (keyword null) 之间的区别。第三件事是检查什么是正则表达式以及如何验证包含数值的 String。最后没有意义,它总是被执行,在循环内做验证,并正确设置值。nameFnameF"null""null"nullif(true)whilecheckF

答:

1赞 Bohemian 5/15/2023 #1

您当前的代码仅检查 ,因为所有其他检查都被覆盖了。"9"

要修复你的代码(不做太多改动),你必须做一个逻辑,所以在英语中,它会读作 nameF 不包含“0”,也不包含“1”和 ...,如下所示:AND

boolean checkF=true;
checkF &= nameF.contains("0");
checkF &= nameF.contains("1");
// etc

但是非字母非数字(如逗号)呢?你没有阻止它。

如果您使用正则表达式,有一种更简单的方法:

String nameF = "";
while (!nameF.matches("[a-zA-Z]+")) {
    System.out.println("Please type in your first name: ");
    nameF = inputs.nextLine();
}

这将一直循环,直到由一个或多个字母字符组成。由于初始化为空白,因此它始终至少执行一次循环。nameFnameF

评论

0赞 Elliott Frisch 5/15/2023
while (!nameF.matches("\\D+")) {
0赞 Bohemian 5/15/2023
@ElliottFrisch会接受.社会还没有到那里。"\\D+""😀💩😱"
1赞 Elliott Frisch 5/15/2023
这位已故的艺术家,原名普林斯,想说一句话。
1赞 Elliott Frisch 5/15/2023
“你永远不应该用数字写单词,除非你七岁或你的名字是王子” -- 文字犯罪 - 奇怪的艾尔
0赞 Bohemian 5/15/2023
@Elliott同意了。甚至 Seven of Nine 也避开了数字。
0赞 Elliott Frisch 5/15/2023 #2

首先,您不能更改 的签名(需要 )。其次,您可以使用正则表达式来确定 的任何部分是否为数字。假设您打算检查是否也不包含数字,我建议您使用 .一对无限循环之类的东西,mainString[]StringnameLPattern

public static void main(String[] args) {
    // Initializing variables
    // Setting up scanner
    Scanner inputs = new Scanner(System.in);
    String nameF = "null";
    String nameL = "null";
    String gender = "null";
    int age = 0;

    Pattern containsDigit = Pattern.compile(".*[0-9].*"); // .*\\d.* also works
    // Initiating user input
    while (true) {
        System.out.println("Please type in your first name.");
        nameF = inputs.nextLine();
        if (!containsDigit.matcher(nameF).matches()) {
            break;
        }
    }
    while (true) {
        System.out.println("Please type in your last name.");
        nameL = inputs.nextLine();
        if (!containsDigit.matcher(nameL).matches()) {
            break;
        }
    }
    System.out.printf("Hello %s %s%n", nameF, nameL);
}