我想知道如何将我的英国邮政编码验证器变成美国邮政编码验证器。目前,我的程序从文本文件中读取邮政编码,并验证它们是否是有效的英国邮政编码。这很好但我想在美国邮政编码中读取而不是英国邮政编码,然后验证它们。以下是我目前的计划。
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
感谢任何帮助,请随时提出任何问题。
答案 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工作,这是一个地址验证和自动完成公司。)