【问题标题】:Java - Zip Code Validator not working?Java - 邮政编码验证器不起作用?
【发布时间】:2016-04-30 11:20:02
【问题描述】:

我的邮政编码验证器存在一些问题,它读取带有英国邮政编码的文本文件,然后在验证后返回 true 或 false。

下面是我遇到问题的代码部分,特别是 (ZipCodeValidator),它是公共的,应该在名为 ZipCodeValidator.java 的文件中声明。然后是找不到符号的(Zip)。

public class ZipCodeValidator {
    private static String regex = "^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$";
    private static Pattern pattern = Pattern.compile(regex);

    public boolean isValid(String zipCode) {
        Matcher matcher = pattern.matcher(zip);
        return matcher.matches();
    }
}

下面是整个程序供参考。任何帮助表示赞赏。

package postcodesort;

import java.util.*;
import java.util.Random;
import java.util.Queue;
import java.util.TreeSet;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.StringTokenizer;
import java.util.zip.ZipFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;




public class PostCodeSort 
{
    Queue<String> postcodeStack = new LinkedList<String>();

    public static void main(String[] args) throws IOException 
    {
        FileReader fileReader = null;
        ZipCodeValidator zipCodeValidator = new ZipCodeValidator();

        // Create the FileReader object
        try {
            fileReader = new FileReader("postcodes1.txt");
            BufferedReader br = new BufferedReader(fileReader);

            String str;
            while((str = br.readLine()) != null) 
            {
                if(zipCodeValidator.isValid(str)){
                    System.out.println(str + " is valid");
                }
                else{
                    System.out.println(str + " is not valid");
                }
            }
        }
        catch (IOException ex) 
        {
            // handle exception;
        }

        finally 
        {
            fileReader.close();
        }

    }
}

public class ZipCodeValidator {
    private static String regex = "^[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$";
    private static Pattern pattern = Pattern.compile(regex);

    public boolean isValid(String zipCode) {
        Matcher matcher = pattern.matcher(zip);
        return matcher.matches();
    }
}

【问题讨论】:

  • 你有没有在 regex101 上检查过你的正则表达式?
  • 我之前在另一个不从文本文件读取的更简单的程序中使用过正则表达式。当我添加了读取文件代码时,问题就出现了,就像我上面指定的那样,但感谢正则表达式 101 提示:)
  • 你试过没有关闭 $ 吗?
  • 不,但我不知道这将如何解决我的问题。似乎它无法解决我遇到的问题。
  • 如果您的正则表达式之前工作并且您的循环确实读取了文件并且能够打印值,您的问题可能是由杂散空格或换行符引起的

标签: java regex stack queue postal-code


【解决方案1】:

可能是复制+粘贴问题,但Matcher matcher = pattern.matcher(zip); 与方法参数zipCode 不匹配。您是否在其他地方定义了zip,并可能对此进行验证?

当我添加了读取文件代码时,问题就出现了,就像我上面指定的那样

确保在传入之前清理字符串。要删除任何前导或尾随空白字符,请使用

if(zipCodeValidator.isValid(str.strip())){

最后,你的正则表达式只匹配大写。确保使用

允许所有情况
str.strip().toUpperCase()

或更改您的正则表达式:

private static Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

【讨论】:

  • 好的,所以大写问题已经解决(谢谢),我将 zip 更改为 zipCode 解决了这个问题,但 ZipCodeValidator 仍然没有发挥作用。这是新的错误消息:ZipCodeValidator 类是公共的,应在名为 ZipCodeValidator.java 的文件中声明。请帮忙:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2013-10-09
  • 2018-07-21
  • 2014-09-08
  • 1970-01-01
  • 2022-12-11
相关资源
最近更新 更多