Java-英国邮政编码验证程序到美国邮政编码验证程序

Java-英国邮政编码验证程序到美国邮政编码验证程序,java,regex,validation,netbeans,Java,Regex,Validation,Netbeans,我想知道如何将我的英国邮政编码验证程序转换为美国邮政编码验证程序。目前,我的程序从文本文件中读取邮政编码,并验证它们是否为有效的英国邮政编码。这很有效,但我也希望阅读美国邮政编码,而不是英国邮政编码,然后验证它们。下面是我目前的计划 package postcodesort; import java.util.*; import java.util.Queue; import java.util.TreeSet; import java.io.File; import java.io.Buff

我想知道如何将我的英国邮政编码验证程序转换为美国邮政编码验证程序。目前,我的程序从文本文件中读取邮政编码,并验证它们是否为有效的英国邮政编码。这很有效,但我也希望阅读美国邮政编码,而不是英国邮政编码,然后验证它们。下面是我目前的计划

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();
    }

}
}
我还在要读取的文本文件中包含了一小部分数据

“01”、“35005”、“AL”、“亚当斯维尔”,86.959727,33.58843710616,0.002627

“05”、“72001”、“AR”、“ADONA”,92.903325,35.046956494,0.00021

“06”、“90804”、“CA”、“信号山”,118.155187,33.78299336092,0.001213


非常感谢您的帮助,请随时提问。

一个简单的解决方案就是更改正则表达式。这个问题建议正则表达式应该是
^\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();
}
}

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

一个简单的解决方案是只更改正则表达式。这个问题建议正则表达式应该是
^\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列表进行验证,但它的实现要简单得多:)

通常,我建议您使用成熟的地址验证服务,因为:有很多小方法可以搞糟大问题

但是,您的用例实际上是特定的:您有始终相同的数据行,您只需要一个验证器来检查行的特定位置是否有5位邮政编码

因此,在这里,我对您的正则表达式验证程序代码进行了编辑,使其与您所说的获取的数据相匹配:

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();
    }
}
你可以在手机上玩正则表达式。如果将鼠标悬停在正则表达式中的字符上,则弹出窗口将告诉您每个部分的含义


(完全公开:我曾为一家地址验证和自动完成公司工作。)

通常,我建议你使用一个完善的地址验证服务,因为:有很多小方法可以把事情搞砸

但是,您的用例实际上是特定的:您有始终相同的数据行,您只需要一个验证器来检查行的特定位置是否有5位邮政编码

因此,在这里,我对您的正则表达式验证程序代码进行了编辑,使其与您所说的获取的数据相匹配:

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();
    }
}
你可以在手机上玩正则表达式。如果将鼠标悬停在正则表达式中的字符上,则弹出窗口将告诉您每个部分的含义


(完全披露:我为一家地址验证和自动补全公司工作。)

您需要修改正则表达式检查以适合美国邮政格式,而不是英国邮政格式。如果你用几个例子来发布US格式,你会更容易找到正确的正则表达式来处理它。是的,正如Dave所说,我们需要一些例子。如果邮政编码只有5个数字,这就不同于如果它还包含扩展名的话。我已经发布了一些我将要阅读的示例。所以我想让它读5个数字,然后读前两个数字。就像这个“01”,“35006”,“AL”。这就是我想要阅读和验证的全部内容,因为有10000个条目。您需要修改正则表达式检查,以适合美国邮政格式,而不是英国邮政格式。如果你用几个例子来发布US格式,你会更容易找到正确的正则表达式来处理它。是的,正如Dave所说,我们需要一些例子。如果邮政编码只有5个数字,这就不同于如果它还包含扩展名的话。我已经发布了一些我将要阅读的示例。所以我想让它读5个数字,然后读前两个数字。就像这个“01”,“35006”,“AL”。这就是我想要读取和验证的全部内容,因为有10000个条目。正则表达式适用于这种形式的数据吗?“01”,“35005”,“AL”,“ADAMSVILLE”,86.959727,33.58843710616,0.002627。最终我希望程序读取条目并验证邮政编码(如果有5个号码)。在这种情况下,它将是“35005”?在它被验证之后,我想将该条目分配到一个特定的状态,该状态将取自前两个数字。如果是“01”。但这是另一天:)我不想从我的邮政编码列表中删除10000条数据,如何使用我的邮政编码列表进行验证。正则表达式对这种形式的数据有效吗?“01”,“35005”,“AL”,“ADAMSVILLE”,86.959727,33.58843710616,0.002627。最终我希望程序读取条目并验证邮政编码(如果有5个号码)。在这种情况下,它将是“35005”?在它被验证之后,我想将该条目分配到一个特定的状态,该状态将取自前两个数字。如果是“01”。但这是另一天:)我不想从我的邮政编码列表中删除10000条数据,如何使用我的邮政编码列表进行验证。