循环和字符方法

时间:2013-07-23 03:43:27

标签: java validation user-input

我有点卡在我正在研究的这个项目的第3部分。以下是要求:

  1. 程序将提示用户输入有效的姓氏,然后重新输入,直到输入有效的姓氏。姓氏有效,如果它只包含字母和空格,它以字母开头和结尾,并且不包含2个连续的空格。

  2. 该程序然后提示出生一年。有效出生年份是1900年到1999年之间的整数,但是您的程序必须在非数字输入时重新提供。隐含地,这意味着您必须将数据作为字符串读取。

  3. 最后,程序会提示输入有效的威斯康星州驾驶执照号码。它的格式为LDDD-DDDD-DDDD-DD,其中L是大写字母,每个D是一个数字。例如, A123-4567-8901-23。该程序会重新输入,直到输入有效数字,包括破折号。

  4. 要使这些输入保持一致,姓氏的第一个字母必须与驾驶执照号码的第一个字母相匹配。案例被忽略,因此“el Guapo”的姓氏将匹配以“E”开头的驾驶执照号码。此外,出生年份的最后2位数字以驾驶执照号码(用Y表示)编码:LDDD-DDDY-YDDD-DD。所以A123-4567-8901-23属于1978年出生的人。如果姓氏,出生年份和驾驶执照号码一致,则程序打印一致;否则,它打印出欺诈行为。

  5. 这是我到目前为止所做的:

    import java.util.Scanner;
    
    public class Program06
    {
        public static void main(String[] args)
        {
            Scanner stdIn = new Scanner(System.in);
    
            boolean legal = false;
            boolean space = false;
    
            String name;
            String yearStr = null;
            String licenseNumber;
            int yearInt;
    
            // while legal is false, loop
            while (!legal)
            {
                System.out.print("Enter a last name: ");
                name = stdIn.nextLine();
    
                legal = true; // legal will be true, until illegal input found
    
                if (Character.isLetter(name.charAt(0)) 
                    && Character.isLetter(name.charAt(name.length() - 1)))
                {
    
                    // if first and last characters are letters, check rest, else is
                    // illegal
    
                    for (int i = 0; i < name.length() && legal; i++)
                    {
                        // walking through name, checking each letter.
                        // if legal = false, will break loop
    
                        if (Character.isLetter(name.charAt(i)))
                        {
                            space = false; // resetting space
                        }
                        else if (name.charAt(i) == ' ')
                        {
                            // making sure not 2 spaces in a row
                            if (!space)
                            {
                                space = true;
                            }
                            else
                            {
                                legal = false;
                            }
                        }
                        else
                        {
                            legal = false;
                        }
    
                    }
                    else
                    {
                        legal = false;
                    }
                }
    
                legal = false;
    
                while (!legal)
                {
                    System.out.println("Enter year of birth: ");
                    yearStr = stdIn.nextLine();  
    
                    if (yearStr.matches("19[\\d][\\d]"))
                    {
                        legal = true;
                    }
                }
    
                legal = false;
    
                while (!legal)
                {
                    System.out.println("Enter driver's license number: ");
                     licenseNumber = stdIn.nextLine();  
    
                    // Here
                    if (licenseNumber.matches("\\p{Lu}"))
                    {
                        legal = true; 
                    }
                }
            }
        }
    

    在底部的第三个while循环(标记为// Here),您可以看到我在其中使用了\\p{Lu} if (licenseNumber.matches("\\p{Lu}")){声明。这显然只是测试大写字母,而不是其他“驾驶执照号码”的有效性。什么条件会起作用?

1 个答案:

答案 0 :(得分:0)

实际上所有验证都可以使用String.matches()来完成,input.matches("^(?!.* )(?i)[a-z]([a-z ]*[a-z])?") 使用正则表达式断言输入具有某种格式。

验证姓氏:

(?i

这允许单个字母的边缘情况作为姓氏,从技术上满足要求。使用负前瞻来检查没有两个相邻的空格。 input.matches("19\\d\\d") )使正则表达式不区分大小写,以案例为例。


验证出生年份:

input.matches("[A-Z]\\d(\\d\\d-\\d\\d){3}")

相当简单。


验证驾驶执照格式

license.charAt(0) == lastName.toUpperCase().charAt(0) &&
  license.charAt(8) == yearOfBirth.charAt(2) &&
  license.charAt(10) == yearOfBirth.charAt(3);

我注意到模式是“字母”,“数字”,然后是3组“数字数字短划线数字”,所以我就这样编码了。


验证驾驶执照内容

{{1}}