Java验证邮政编码

Java验证邮政编码,java,validation,Java,Validation,我正在尝试编写一个程序,它将验证格式为A1A1或A1A1A1的加拿大邮政编码。我无法让代码识别第二种格式中的空白 当我运行它并尝试第二种格式时,它会说两次无效,即使它是合法的邮政编码 有什么想法吗 public class validatePostalCodeTest { public static void main(String[] args) { Scanner kb = new Scanner(System.in); System.out.println("Pleas

我正在尝试编写一个程序,它将验证格式为A1A1或A1A1A1的加拿大邮政编码。我无法让代码识别第二种格式中的空白

当我运行它并尝试第二种格式时,它会说两次无效,即使它是合法的邮政编码

有什么想法吗

public class validatePostalCodeTest {
  public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    System.out.println("Please enter postalcode:");
    while (kb.hasNext()){
        String posCode = kb.next();
        if (posCode.length() > 7) 
            System.out.println("\nInvalid");
        if (posCode.length() < 6) 
            System.out.println("\nInvalid");    
        if (posCode.length()== 7){
            boolean valid = true;
            for (int i = 0; i < posCode.length(); i++){
                char a = posCode.charAt(0);
                char b = posCode.charAt(2);
                char c = posCode.charAt(4);
                char d = posCode.charAt(1);
                char e = posCode.charAt(5);
                char f = posCode.charAt(6);
                char g = posCode.charAt(3);
                if(! Character.isLetter(a))
                    valid = false; 
                else if (! Character.isLetter(b))
                    valid = false;
                else if (! Character.isDigit(c))
                    valid = false;
                else if (! Character.isDigit(d))
                    valid = false;
                else if (! Character.isLetter(e))
                    valid = false;
                else if (! Character.isDigit(f))
                    valid = false;
                else if (! Character.isWhitespace(g))
                    valid = false;
                break;
            }
            if (valid) System.out.println("\nValid");
            else System.out.println("\nInvalid");
        }
        if (posCode.length()== 6){
            boolean valid = true;
            for (int i = 0; i < posCode.length(); i++){
                char a = posCode.charAt(0);
                char b = posCode.charAt(2);
                char c = posCode.charAt(4);
                char d = posCode.charAt(1);
                char e = posCode.charAt(3);
                char f = posCode.charAt(5);
                if(! Character.isLetter(a))
                    valid = false; 
                else if (! Character.isLetter(b))
                    valid = false;
                else if (! Character.isLetter(c))
                    valid = false;
                else if (! Character.isDigit(d))
                    valid = false;
                else if (! Character.isDigit(e))
                    valid = false;
                else if (! Character.isDigit(f))
                    valid = false;
                break;                    
            }
            if (valid) System.out.println("\nValid");
            else System.out.println("\nInvalid");
        }
        System.out.println("\nPlease enter a postalcode:");
    }
    System.out.println("Program ending due to end-of-file");
  }
}

我只想在这里使用正则表达式:

boolean isPostalCodeValid (String postalcode) {
    return postalcode.matches("^\\w\\d\\w\\d\\w\\d|\\w\\d\\w\\s\\d\\w\\d$"));
}
此处演示:

请尝试上述逻辑。我已对其进行了优化。

您已使用kb.next,它将以空格分隔方式读取数据, 因此,当您将邮政编码输入为A1A 1A1时,将需要2次,第一次输入为A1A,第二次输入为1A1,因此您将获得2次无效输出,因为这将需要2次数据和一个空格,因此您需要使用nextLine,它将帮助您解决问题

检查下面的答案


让我们从简化代码开始

您的循环最多只能执行一次,因为循环的末尾有一个中断,这确实提出了一个问题,为什么还要麻烦这些循环呢

您描述了加拿大邮政编码格式,其一般形式如下:

/[A-Z]\d[A-Z]\d[A-Z]\d/
没有空间,和

/[A-Z]\d[A-Z]\s\d[A-Z]\d/
…其中[A-Z]表示大写字符类A到Z,\d表示0到9之间的数字,\s表示空白字符。我知道您没有使用正则表达式,但这就是我计划如何表示您需要解决的数据

让我们从简化这个案例开始,不要在其中留空间。这就是你的第二个循环。我们首先从next切换到nextLine,以便在扫描仪中使用

String posCode = kb.nextLine();
现在,我们只需要读入整行并检查其长度。如果它等于6,我们继续-你的代码已经这样做了

if(posCode.length() == 6) {
    // validation logic
}
现在是棘手的部分。你还记得我上面提到的正则表达式吗?碰巧它们有一种模式:

偶数位置字符必须是从a到Z的字符。 奇数位字符必须是0到9之间的数字。 有了它,我们可以构造一个循环,根据这个逻辑为我们检查一些事情。请注意Character.isliter和Character.isDigit上的否定

通过执行上述操作,您只需要一种方法,就可以成功验证这两种情况。

您可以减少许多if-else语句,并减少代码行数

以下代码与您的逻辑相同,它正在按您的要求检查邮政编码:

public class validatePostalCodeTest {

    public static void main(String[] args) throws java.lang.Exception {

        Scanner kb = new Scanner(System.in);
        System.out.println("Please enter postalcode:");
        char charPC[] = kb.nextLine().toCharArray();
        boolean valid = false;

        if (charPC.length == 7) {
            if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[5])
                    && Character.isDigit(charPC[4]) && Character.isDigit(charPC[1]) && Character.isDigit(charPC[6])
                    && Character.isWhitespace(charPC[3])) {
                valid = true;
            }
        }

        else if (charPC.length == 6) {
            if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[4])
                    && Character.isDigit(charPC[1]) && Character.isDigit(charPC[3]) && Character.isDigit(charPC[5])) {
                valid = true;
            }
        }

        if (valid)
            System.out.println("\nValid");
        else 
            System.out.println("\nInvalid");

        System.out.println("Program ending due to end-of-file");
    }
}

如果输入为A1A 1A1,则posCode.charAt0为“A”,posCode.charAt2为“A”,posCode.charAt4为“1”。这是一个赋值吗?正则表达式可能要简单得多。我固定了正确的字符位置,但我仍然遇到同样的问题-是的,这是一个作业,我们还没有被教过正则表达式,所以我不确定这是否会被接受。我的导师还没有教过我们正则表达式,所以我不确定这是否会被接受我认为正则表达式绝对是解决这个问题的方法。我将把这个答案留在这里,因为其他可能正在搜索的人会从这个方法中受益。不需要if块,您只需返回字符串。matches我尝试了这个方法,但仍然遇到同样的问题您的输入是什么?我输入了A1A 1A1
if(posCode.length() == 6) {
    // validation logic
}
for(int i = 0; i < posCode.length(); i++) {
    if(i % 2 == 0) { // even digits
        if(!Character.isLetter(posCode.charAt(i))) {
            // reject!
            System.out.println("Invalid!");
            break;
        }
    } else { // odd digits
        if(!Character.isDigit(posCode.charAt(i))) {
            // reject!
            System.out.println("Invalid!");
            break;
        }
    }
}
int spaceLocation = posCode.indexOf(" ");
if(spaceLocation != -1) {
    // carve the space out and concatenate
    posCode = posCode.substring(0, spaceLocation) + posCode.substring(spaceLocation + 1, posCode.length());
}
public class validatePostalCodeTest {

    public static void main(String[] args) throws java.lang.Exception {

        Scanner kb = new Scanner(System.in);
        System.out.println("Please enter postalcode:");
        char charPC[] = kb.nextLine().toCharArray();
        boolean valid = false;

        if (charPC.length == 7) {
            if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[5])
                    && Character.isDigit(charPC[4]) && Character.isDigit(charPC[1]) && Character.isDigit(charPC[6])
                    && Character.isWhitespace(charPC[3])) {
                valid = true;
            }
        }

        else if (charPC.length == 6) {
            if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[4])
                    && Character.isDigit(charPC[1]) && Character.isDigit(charPC[3]) && Character.isDigit(charPC[5])) {
                valid = true;
            }
        }

        if (valid)
            System.out.println("\nValid");
        else 
            System.out.println("\nInvalid");

        System.out.println("Program ending due to end-of-file");
    }
}