0

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

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

  2. 然后程序会提示出生年份。有效的出生年份是 1900 和 1999 之间的整数,包括 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 年出生的人。如果姓氏、出生年份和驾照号码一致,则程序打印一致;否则,它打印欺诈。

这是我到目前为止所拥有的:

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}")){语句中使用了。这显然只测试大写字母,而不是“驾驶执照号码”其余部分的有效性。什么条件可以工作?

4

1 回答 1

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}")

我注意到模式是“字母”,“数字”,然后是 3 组“数字数字破折号数字”,所以我这样编码。


要验证驾驶执照内容

license.charAt(0) == lastName.toUpperCase().charAt(0) &&
  license.charAt(8) == yearOfBirth.charAt(2) &&
  license.charAt(10) == yearOfBirth.charAt(3);
于 2013-07-23T03:53:55.687 回答