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 回答