我正在尝试读取输入字符串 - 如果它符合预定义的模式,则应该返回它。如果输入不正确,则应抛出异常。
这是我到目前为止所拥有的。我的问题是无论输入如何,它总是抛出一个异常。我在这里做错了什么?
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]");
答案 0 :(得分: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");
}
}
答案 1 :(得分: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
。