1

入力文字列を読み取ろうとしています - 事前定義されたパターンに準拠している場合は、返されます。入力が正しくない場合は、例外をスローする必要があります。

これが私がこれまでに持っているものです。私の問題は、入力に関係なく、常に例外がスローされることです。ここで何が間違っているのでしょうか?

public String readPostCode() throws InputMismatchException
{
    Scanner in = new Scanner(System.in);
    String postcode;
    System.out.println("Please enter a Postcode");
    postcode = in.next(this.pattern);
    return postcode;
}

上記のメソッドを try/catch ステートメントで使用すると、常に InputMismatchException がキャッチされます。

編集:パターンの定義は次のとおりです。

public Pattern pattern = Pattern.compile(   "[a-zA-Z]" +
                                            "([0-9]|[a-zA-Z])" +
                                            "(|[0-9]|[0-9][0-9]|[a-zA-Z]|[0-9][a-zA-Z])" +
                                            " [0-9][a-zA-Z][a-zA-Z]");
4

2 に答える 2

0

:コードはテストされていません。

カナダの郵便番号の場合 (ロケールが定義されていないため)

使用: (^[a-zA-Z][0-9][a-zA-Z]\s?[0-9][a-zA-Z][0-9]$)

受け付ける入力例:A2B 3P7

public String readPostCode(){
        Scanner in = new Scanner(System.in);
        String postcode = scan.nextLine().toUpperCase();
        try {
           if(postcode.matches("^[A-Z][0-9][A-Z]\s?[0-9][A-Z][0-9]$"){
              return postcode;
            }
         } catch (InputMismatchException IME){
              System.out.println("Input does not match required format");
         }
    }
于 2012-11-17T20:15:31.057 に答える
0

Scannerデフォルトでは空白で区切ります。スペースを含む入力を読み取るには、改行のみを区切るように設定します。

in.useDelimiter("\n");

パターンをかなり単純化することもできます。大文字と小文字を区別しないよう{n,m}にし、少なくとも繰り返し回数nと最大m回数を繰り返すパターンを指定するために使用します。

Pattern.compile("[A-Z]{1,2}[0-9]{1,3}\\s?[0-9][A-Z]{2}", Pattern.CASE_INSENSITIVE);

これは英国の郵便番号用であることに注意LS1 2AAしてください。

于 2012-11-17T20:15:52.013 に答える