Java - 美国邮政编码验证器的英国邮政编码验证器

时间:2016-06-06 17:06:58

标签: java regex validation netbeans

我想知道如何将我的英国邮政编码验证器变成美国邮政编码验证器。目前,我的程序从文本文件中读取邮政编码,并验证它们是否是有效的英国邮政编码。这很好但我想在美国邮政编码中读取而不是英国邮政编码,然后验证它们。以下是我目前的计划。

package postcodesort;

import java.util.*;
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.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("usvalidcodes.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();
    }

}
}

以下是通过正则表达式进行验证的代码部分。

package postcodesort;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
*
* @author ec1312017
*/
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, Pattern.CASE_INSENSITIVE);

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

我还在文本文件中包含了一小部分数据供您阅读。

“01”,“35005”,“AL”,“ADAMSVILLE”,86.959727,33.588437,10616,0.002627

“05”, “72001”, “AR”, “ADONA”,92.903325,35.046956,494,0.00021

“06”,“90804”,“CA”,“SIGNAL HILL”,118.155187,33.782993,36092,0.001213

感谢任何帮助,请随时提出任何问题。

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案就是改变正则表达式。这个问题regex for zip-code表明正则表达式应为^\d{5}(?:[-\s]\d{4})?$

所以班级看起来像这样:

public class ZipCodeValidator {

private static String regex = "^\d{5}(?:[-\s]\d{4})?$";
private static Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);


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

这不会对您提供的zipcoes列表进行验证,但实现起来要简单得多:)

答案 1 :(得分:0)

通常情况下,我建议你使用一个完善的地址验证服务,因为parsing and matching addresses is pretty complicated:有很多方法可以解决大问题。

但是,您的用例非常具体:您的数据行总是相同的,并且您只需要一个验证器来检查该行的特定位置是否有5位数的邮政编码。 / p>

所以,在这里,我对你的正则表达式验证器代码进行了编辑,使其与你说的数据相符:

public class ZipCodeValidator {
    private static String regex = "^"\d{2}","\d{5}","\w{2}","[\w ]+",\d*\.?\d*,\d*\.?\d*,\d*,\d*\.?\d*$";
    private static Pattern pattern = Pattern.compile(regex, 
    Pattern.CASE_INSENSITIVE);

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

您可以在this example on regexr.com上使用正则表达式。如果将鼠标悬停在正则表达式中的字符上,弹出窗口将告诉您每个部分的含义。

(完全披露:我曾在SmartyStreets工作,这是一个地址验证和自动完成公司。)