用户输入的Java验证问题

时间:2018-10-20 08:43:12

标签: java validation input

我知道关于Java的输入验证存在很多问题,但是无论我读什么,我似乎都无法正常工作。我希望用户将出生日期输入为(MM DD YYYY)。我想验证一下

  1. 仅用户输入数字
  2. 他们输入了正确的数字,并且
  3. 数字在正确的范围内。

我的第一次尝试是使用int变量,但似乎无法将hasNextInt()与数字长度和范围结合在一起。然后,我看到一则帖子说要做String变量,然后使用Integer.parseInt()。我认为如果使用(!month.matches("0[1-9]") || !month.matches("1[0-2]")会很好用,因为它似乎满足了我所有的验证愿望。我在一段时间的语句中尝试了此方法,但是它陷入了不确定的循环。然后,我尝试将该代码更改为if ... else语句,并用while(false)语句将其包围。但是,它现在抛出一个错误,而不是转到我的声明中指出要纠正错误的语句。这是我的代码目前的样子:

import java.util.Scanner; //use class Scanner for user input

public class BD {
    private static Scanner input = new Scanner(System.in); //Create scanner

    public static void main(String[] args){
        //variables
        String month;
        int birthMonth;
        String day;
        int birthDay;
        String year;
        int birthYear;
        boolean correct = false;

        //prompt for info
        System.out.print("Please enter your date of birth as 2 digit "+
            "month, 2 digit day, & 4 digit year with spaces in-between"+
            " (MM DD YYYY): ");
        month = input.next();
        //System.out.printf("%s%n", month);  //test value is as expected
        day = input.next();
        year = input.next();

        //validate month value
        while (correct = false){
            if(!month.matches("0[1-9]") || !month.matches("1[0-2]")){
                System.out.println("Please enter birth month as "+
                    "a 2 digit number: ");
                month = input.next();
                //System.out.printf("%s%n", month);
            }
            else {
                correct = true;
            }
        }

        //turn strings into integers
        birthMonth = Integer.parseInt(month);
        birthDay = Integer.parseInt(day);
        birthYear = Integer.parseInt(year);

        //check values are correct
        System.out.printf("%d%d%d", birthMonth, birthDay, birthYear);
    }
}

任何帮助将不胜感激。我也想尝试执行此验证而没有任何try / catch块,因为这些块似乎太大了。 谢谢!

2 个答案:

答案 0 :(得分:1)

如果您想使用正则表达式,可以尝试一下

    while(!(Pattern.matches("(0)[1-9]{1}|(1)[0-2]",month)))
    {
           System.out.println("Enter again \n");
           month=input.next();
    }

要使此代码正常工作,您需要在程序开头使用regex软件包

  import java.util.regex.*;

我们的正则表达式分为两部分“ (0)[1-9] {1} ”,这将首先确保字符串包含“ 0”,然后是1-9之间的任何数字。并且“ {1} ”将确保它仅出现一次。

根据需要类似地编写日期和年份的代码。

答案 1 :(得分:0)

使用DateTimeFormatter这样的东西:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");

try {
    LocalDate date = LocalDate.parse(input, formatter);
} catch (DateTimeParseException e) {
    // Thrown if text could not be parsed in the specified format
}