0

私が取り組んでいるこのプログラムのパート 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 年生まれの人に属します。姓、生年月日、および運転免許証番号が一致している場合、プログラムは一致して出力します。そうしないと、不正に印刷されます。

これが私がこれまでに持っているものです:

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; 
                }
            }
        }
    }

一番下の 3 番目の while ループ ( としてマーク) で、ステートメント内で // Here使用したことがわかります。これは明らかに、「運転免許証番号」の残りの有効性ではなく、大文字のみをテストします。どのような条件が機能しますか?\\p{Lu}if (licenseNumber.matches("\\p{Lu}")){

4

1 に答える 1

0

実質的にすべての検証はString.matches()、正規表現を使用して入力が特定の形式であることをアサートする を使用して実行できます。

姓を検証するには:

input.matches("^(?!.*  )(?i)[a-z]([a-z ]*[a-z])?")

これにより、単一の文字が姓であるというエッジケースが可能になり、技術的に要件を満たします。2 つの隣接するスペースがないことを確認するために、負の先読みが使用されます。(?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 に答える