以最大概率从名片中提取地址
Extract address from business card with maximum probability
我有名片的图片。使用 OCR,我可以将此图像转换为文本。
现在想把信息分开,加进联系方式
通过正则表达式,我可以解析 phone、电子邮件、网站等信息,但无法从中分离地址,因为格式因卡而异。
我在 Android 平台的设备上使用 firebase ml 工具包。我附上 OCR 的输出。
来自 google 个图像的名片输入图像
OCR的输出是
- 第 1 行 = [larriS,保险]
- 第 2 行 = [A, Legacy, of, Quality, Service]
- 第 3 行 = [Wayne, Stansfield, i, CLCS]
- 4 号线 = [1380, Rio, Rancho, Blvd, SE363]
- 第 5 行 = [Rio, Rancho, NM, 87124]
- 第 6 行 = [CELL, 505.554.0510]
- 第 7 行 = [PHONE, 505-818-9377]
- 第 8 行 = [传真,888-753.4449]
- 第 9 行 = [WayneJames@me.com]
已检查 link1, link2 and link3 但未能从正则表达式中找到地址,因此我尝试通过间接方式找到它。
如果它有邮政编码,则尝试通过它查找地址,但邮政编码也各不相同。找到一些希望 Using multiple regex for a different country 但这不是解决方案,你能帮我找到一种方法来提取它吗?我知道它可以 100% 地适用于市场上所有类型的格式,但我想涵盖最大值。
这是可以执行此操作的参考应用程序
CardCam Application
Business Card Reader Free - Business Card Scanner
读卡API不过这些都是付费的
您按每一行提取信息并识别其中的一些,例如第 6-8 行被识别,您还可以将第 9 行定义为电子邮件。
所以你对第 1-5 行的唯一怀疑。
您不能 100% 确定该行是否符合任何正则表达式,因为没有 'protocol' 地址应该如何打印在卡片上,所以您可以假设
- 最有可能的地址应该在第 2+ 行,因为大多数情况下第 1 行会有公司名称。
- 地址的一部分应包含预定义的值,例如
- 大道
- st.
- 街道
- [XX](状态定义)
- Zip - 邮政编码的正则表达式非常简单
- 其他关键词
- 地址最有可能以邮政编码开头。
因此,如果将所有这些组合成一种方法,您将获得一种算法,可以预测是否存在可能的地址。
根据上面的假设更有可能是第4行和第5行地址因为
- 第 4 行从一个看起来像邮政编码的数字开始,
- 第 5 行包含有点像 state
更新
复杂的解决方案可能如下所示:
public static float checkLineForAddress(List<String> testdata) {
boolean containsZip = false;
boolean containsState = false;
boolean containsAddressKeyword = false;
boolean containsWord = false;
boolean containsCapitalizedWord = false;
boolean containsNumber = false;
boolean containsBuildingNum = false;
for (String item : testdata) {
Set<Map.Entry<String, String>> entries = zipRegexps.entrySet();
for (Map.Entry<String, String> entry : entries) {
containsZip = containsZip || item.matches(entry.getValue());
if (containsZip) break;
}
containsState = containsState || item.matches("[A-Z]{2}");
containsBuildingNum = containsBuildingNum || item.contains("/");
containsWord = containsWord || item.matches("[A-Za-z]+");
containsCapitalizedWord = containsCapitalizedWord || item.matches("[A-Z]+[a-z]+");
for (String addressKeyword : addressKeywords) {
containsAddressKeyword = containsAddressKeyword || item.replace(".", "").equalsIgnoreCase(addressKeyword);
}
containsNumber = containsNumber || item.matches("[0-9]+");
}
float addressProbability = 0;
if (containsZip && containsCapitalizedWord && (containsState || containsAddressKeyword)) return 1f;
if (containsZip && containsWord) addressProbability = 0.5f;
if (containsCapitalizedWord) addressProbability += 0.1f;
if (containsAddressKeyword) addressProbability += 0.2f;
if (containsNumber) addressProbability += 0.05f;
if (containsBuildingNum) addressProbability += 0.05f;
if (testdata.size() > 1) addressProbability += 0.05f;
if (testdata.size() > 2) addressProbability += 0.05f;
return addressProbability;
}
我从这里获取了邮政编码列表:What is the ultimate postal code and zip regex?,变量的初始化方法:
private static void init() {
zipRegexps.put("GB", "GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}");
zipRegexps.put("JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}");
zipRegexps.put("GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}");
zipRegexps.put("IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}");
zipRegexps.put("US", "\d{5}([ \-]\d{4})?");
zipRegexps.put("CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d");
zipRegexps.put("DE", "\d{5}");
zipRegexps.put("JP", "\d{3}-\d{4}");
zipRegexps.put("FR", "\d{2}[ ]?\d{3}");
zipRegexps.put("AU", "\d{4}");
zipRegexps.put("IT", "\d{5}");
zipRegexps.put("CH", "\d{4}");
zipRegexps.put("AT", "\d{4}");
zipRegexps.put("ES", "\d{5}");
zipRegexps.put("NL", "\d{4}[ ]?[A-Z]{2}");
zipRegexps.put("BE", "\d{4}");
zipRegexps.put("DK", "\d{4}");
zipRegexps.put("SE", "\d{3}[ ]?\d{2}");
zipRegexps.put("NO", "\d{4}");
zipRegexps.put("BR", "\d{5}[\-]?\d{3}");
zipRegexps.put("PT", "\d{4}([\-]\d{3})?");
zipRegexps.put("FI", "\d{5}");
zipRegexps.put("AX", "22\d{3}");
zipRegexps.put("KR", "\d{3}[\-]\d{3}");
zipRegexps.put("CN", "\d{6}");
zipRegexps.put("TW", "\d{3}(\d{2})?");
zipRegexps.put("SG", "\d{6}");
zipRegexps.put("DZ", "\d{5}");
zipRegexps.put("AD", "AD\d{3}");
zipRegexps.put("AR", "([A-HJ-NP-Z])?\d{4}([A-Z]{3})?");
zipRegexps.put("AM", "(37)?\d{4}");
zipRegexps.put("AZ", "\d{4}");
zipRegexps.put("BH", "((1[0-2]|[2-9])\d{2})?");
zipRegexps.put("BD", "\d{4}");
zipRegexps.put("BB", "(BB\d{5})?");
zipRegexps.put("BY", "\d{6}");
zipRegexps.put("BM", "[A-Z]{2}[ ]?[A-Z0-9]{2}");
zipRegexps.put("BA", "\d{5}");
zipRegexps.put("IO", "BBND 1ZZ");
zipRegexps.put("BN", "[A-Z]{2}[ ]?\d{4}");
zipRegexps.put("BG", "\d{4}");
zipRegexps.put("KH", "\d{5}");
zipRegexps.put("CV", "\d{4}");
zipRegexps.put("CL", "\d{7}");
zipRegexps.put("CR", "\d{4,5}|\d{3}-\d{4}");
zipRegexps.put("HR", "\d{5}");
zipRegexps.put("CY", "\d{4}");
zipRegexps.put("CZ", "\d{3}[ ]?\d{2}");
zipRegexps.put("DO", "\d{5}");
zipRegexps.put("EC", "([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?");
zipRegexps.put("EG", "\d{5}");
zipRegexps.put("EE", "\d{5}");
zipRegexps.put("FO", "\d{3}");
zipRegexps.put("GE", "\d{4}");
zipRegexps.put("GR", "\d{3}[ ]?\d{2}");
zipRegexps.put("GL", "39\d{2}");
zipRegexps.put("GT", "\d{5}");
zipRegexps.put("HT", "\d{4}");
zipRegexps.put("HN", "(?:\d{5})?");
zipRegexps.put("HU", "\d{4}");
zipRegexps.put("IS", "\d{3}");
zipRegexps.put("IN", "\d{6}");
zipRegexps.put("ID", "\d{5}");
zipRegexps.put("IL", "\d{5}");
zipRegexps.put("JO", "\d{5}");
zipRegexps.put("KZ", "\d{6}");
zipRegexps.put("KE", "\d{5}");
zipRegexps.put("KW", "\d{5}");
zipRegexps.put("LA", "\d{5}");
zipRegexps.put("LV", "\d{4}");
zipRegexps.put("LB", "(\d{4}([ ]?\d{4})?)?");
zipRegexps.put("LI", "(948[5-9])|(949[0-7])");
zipRegexps.put("LT", "\d{5}");
zipRegexps.put("LU", "\d{4}");
zipRegexps.put("MK", "\d{4}");
zipRegexps.put("MY", "\d{5}");
zipRegexps.put("MV", "\d{5}");
zipRegexps.put("MT", "[A-Z]{3}[ ]?\d{2,4}");
zipRegexps.put("MU", "(\d{3}[A-Z]{2}\d{3})?");
zipRegexps.put("MX", "\d{5}");
zipRegexps.put("MD", "\d{4}");
zipRegexps.put("MC", "980\d{2}");
zipRegexps.put("MA", "\d{5}");
zipRegexps.put("NP", "\d{5}");
zipRegexps.put("NZ", "\d{4}");
zipRegexps.put("NI", "((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?");
zipRegexps.put("NG", "(\d{6})?");
zipRegexps.put("OM", "(PC )?\d{3}");
zipRegexps.put("PK", "\d{5}");
zipRegexps.put("PY", "\d{4}");
zipRegexps.put("PH", "\d{4}");
zipRegexps.put("PL", "\d{2}-\d{3}");
zipRegexps.put("PR", "00[679]\d{2}([ \-]\d{4})?");
zipRegexps.put("RO", "\d{6}");
zipRegexps.put("RU", "\d{6}");
zipRegexps.put("SM", "4789\d");
zipRegexps.put("SA", "\d{5}");
zipRegexps.put("SN", "\d{5}");
zipRegexps.put("SK", "\d{3}[ ]?\d{2}");
zipRegexps.put("SI", "\d{4}");
zipRegexps.put("ZA", "\d{4}");
zipRegexps.put("LK", "\d{5}");
zipRegexps.put("TJ", "\d{6}");
zipRegexps.put("TH", "\d{5}");
zipRegexps.put("TN", "\d{4}");
zipRegexps.put("TR", "\d{5}");
zipRegexps.put("TM", "\d{6}");
zipRegexps.put("UA", "\d{5}");
zipRegexps.put("UY", "\d{5}");
zipRegexps.put("UZ", "\d{6}");
zipRegexps.put("VA", "00120");
zipRegexps.put("VE", "\d{4}");
zipRegexps.put("ZM", "\d{5}");
zipRegexps.put("AS", "96799");
zipRegexps.put("CC", "6799");
zipRegexps.put("CK", "\d{4}");
zipRegexps.put("RS", "\d{6}");
zipRegexps.put("ME", "8\d{4}");
zipRegexps.put("CS", "\d{5}");
zipRegexps.put("YU", "\d{5}");
zipRegexps.put("CX", "6798");
zipRegexps.put("ET", "\d{4}");
zipRegexps.put("FK", "FIQQ 1ZZ");
zipRegexps.put("NF", "2899");
zipRegexps.put("FM", "(9694[1-4])([ \-]\d{4})?");
zipRegexps.put("GF", "9[78]3\d{2}");
zipRegexps.put("GN", "\d{3}");
zipRegexps.put("GP", "9[78][01]\d{2}");
zipRegexps.put("GS", "SIQQ 1ZZ");
zipRegexps.put("GU", "969[123]\d([ \-]\d{4})?");
zipRegexps.put("GW", "\d{4}");
zipRegexps.put("HM", "\d{4}");
zipRegexps.put("IQ", "\d{5}");
zipRegexps.put("KG", "\d{6}");
zipRegexps.put("LR", "\d{4}");
zipRegexps.put("LS", "\d{3}");
zipRegexps.put("MG", "\d{3}");
zipRegexps.put("MH", "969[67]\d([ \-]\d{4})?");
zipRegexps.put("MN", "\d{6}");
zipRegexps.put("MP", "9695[012]([ \-]\d{4})?");
zipRegexps.put("MQ", "9[78]2\d{2}");
zipRegexps.put("NC", "988\d{2}");
zipRegexps.put("NE", "\d{4}");
zipRegexps.put("VI", "008(([0-4]\d)|(5[01]))([ \-]\d{4})?");
zipRegexps.put("PF", "987\d{2}");
zipRegexps.put("PG", "\d{3}");
zipRegexps.put("PM", "9[78]5\d{2}");
zipRegexps.put("PN", "PCRN 1ZZ");
zipRegexps.put("PW", "96940");
zipRegexps.put("RE", "9[78]4\d{2}");
zipRegexps.put("SH", "(ASCN|STHL) 1ZZ");
zipRegexps.put("SJ", "\d{4}");
zipRegexps.put("SO", "\d{5}");
zipRegexps.put("SZ", "[HLMS]\d{3}");
zipRegexps.put("TC", "TKCA 1ZZ");
zipRegexps.put("WF", "986\d{2}");
zipRegexps.put("XK", "\d{5}");
zipRegexps.put("YT", "976\d{2}");
addressKeywords.add("blvd");
addressKeywords.add("st");
addressKeywords.add("street");
addressKeywords.add("lane");
}
测试数据是
List<String> testdata = new ArrayList<>();
testdata.add("1380");
testdata.add("Rio");
testdata.add("Rancho");
testdata.add("Blvd");
testdata.add("SE363");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("Rio");
testdata.add("Rancho");
testdata.add("NM");
testdata.add("87124");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("Wayne");
testdata.add("Stansfield");
testdata.add("i");
testdata.add("CLCS");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("James");
testdata.add("Gordon");
testdata.add("Smith");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("5052");
testdata.add("554");
testdata.add("11500");
testdata.add("121151");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("Creative");
testdata.add("Director");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
并输出
E/!@#: 1.0
E/!@#: 1.0
E/!@#: 0.70000005
E/!@#: 0.2
E/!@#: 0.15
E/!@#: 0.15
如您所见,第 3 行是 70% 概率的地址,因为 CLCS
理论上可能是 Bermuda postal code。
您可以根据您的测试数据修改可能性。
我有名片的图片。使用 OCR,我可以将此图像转换为文本。 现在想把信息分开,加进联系方式
通过正则表达式,我可以解析 phone、电子邮件、网站等信息,但无法从中分离地址,因为格式因卡而异。
我在 Android 平台的设备上使用 firebase ml 工具包。我附上 OCR 的输出。
来自 google 个图像的名片输入图像
OCR的输出是
- 第 1 行 = [larriS,保险]
- 第 2 行 = [A, Legacy, of, Quality, Service]
- 第 3 行 = [Wayne, Stansfield, i, CLCS]
- 4 号线 = [1380, Rio, Rancho, Blvd, SE363]
- 第 5 行 = [Rio, Rancho, NM, 87124]
- 第 6 行 = [CELL, 505.554.0510]
- 第 7 行 = [PHONE, 505-818-9377]
- 第 8 行 = [传真,888-753.4449]
- 第 9 行 = [WayneJames@me.com]
已检查 link1, link2 and link3 但未能从正则表达式中找到地址,因此我尝试通过间接方式找到它。
如果它有邮政编码,则尝试通过它查找地址,但邮政编码也各不相同。找到一些希望 Using multiple regex for a different country 但这不是解决方案,你能帮我找到一种方法来提取它吗?我知道它可以 100% 地适用于市场上所有类型的格式,但我想涵盖最大值。
这是可以执行此操作的参考应用程序
CardCam Application Business Card Reader Free - Business Card Scanner
读卡API不过这些都是付费的
您按每一行提取信息并识别其中的一些,例如第 6-8 行被识别,您还可以将第 9 行定义为电子邮件。
所以你对第 1-5 行的唯一怀疑。
您不能 100% 确定该行是否符合任何正则表达式,因为没有 'protocol' 地址应该如何打印在卡片上,所以您可以假设
- 最有可能的地址应该在第 2+ 行,因为大多数情况下第 1 行会有公司名称。
- 地址的一部分应包含预定义的值,例如
- 大道
- st.
- 街道
- [XX](状态定义)
- Zip - 邮政编码的正则表达式非常简单
- 其他关键词
- 地址最有可能以邮政编码开头。
因此,如果将所有这些组合成一种方法,您将获得一种算法,可以预测是否存在可能的地址。
根据上面的假设更有可能是第4行和第5行地址因为 - 第 4 行从一个看起来像邮政编码的数字开始, - 第 5 行包含有点像 state
更新
复杂的解决方案可能如下所示:
public static float checkLineForAddress(List<String> testdata) {
boolean containsZip = false;
boolean containsState = false;
boolean containsAddressKeyword = false;
boolean containsWord = false;
boolean containsCapitalizedWord = false;
boolean containsNumber = false;
boolean containsBuildingNum = false;
for (String item : testdata) {
Set<Map.Entry<String, String>> entries = zipRegexps.entrySet();
for (Map.Entry<String, String> entry : entries) {
containsZip = containsZip || item.matches(entry.getValue());
if (containsZip) break;
}
containsState = containsState || item.matches("[A-Z]{2}");
containsBuildingNum = containsBuildingNum || item.contains("/");
containsWord = containsWord || item.matches("[A-Za-z]+");
containsCapitalizedWord = containsCapitalizedWord || item.matches("[A-Z]+[a-z]+");
for (String addressKeyword : addressKeywords) {
containsAddressKeyword = containsAddressKeyword || item.replace(".", "").equalsIgnoreCase(addressKeyword);
}
containsNumber = containsNumber || item.matches("[0-9]+");
}
float addressProbability = 0;
if (containsZip && containsCapitalizedWord && (containsState || containsAddressKeyword)) return 1f;
if (containsZip && containsWord) addressProbability = 0.5f;
if (containsCapitalizedWord) addressProbability += 0.1f;
if (containsAddressKeyword) addressProbability += 0.2f;
if (containsNumber) addressProbability += 0.05f;
if (containsBuildingNum) addressProbability += 0.05f;
if (testdata.size() > 1) addressProbability += 0.05f;
if (testdata.size() > 2) addressProbability += 0.05f;
return addressProbability;
}
我从这里获取了邮政编码列表:What is the ultimate postal code and zip regex?,变量的初始化方法:
private static void init() {
zipRegexps.put("GB", "GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}");
zipRegexps.put("JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}");
zipRegexps.put("GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}");
zipRegexps.put("IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}");
zipRegexps.put("US", "\d{5}([ \-]\d{4})?");
zipRegexps.put("CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d");
zipRegexps.put("DE", "\d{5}");
zipRegexps.put("JP", "\d{3}-\d{4}");
zipRegexps.put("FR", "\d{2}[ ]?\d{3}");
zipRegexps.put("AU", "\d{4}");
zipRegexps.put("IT", "\d{5}");
zipRegexps.put("CH", "\d{4}");
zipRegexps.put("AT", "\d{4}");
zipRegexps.put("ES", "\d{5}");
zipRegexps.put("NL", "\d{4}[ ]?[A-Z]{2}");
zipRegexps.put("BE", "\d{4}");
zipRegexps.put("DK", "\d{4}");
zipRegexps.put("SE", "\d{3}[ ]?\d{2}");
zipRegexps.put("NO", "\d{4}");
zipRegexps.put("BR", "\d{5}[\-]?\d{3}");
zipRegexps.put("PT", "\d{4}([\-]\d{3})?");
zipRegexps.put("FI", "\d{5}");
zipRegexps.put("AX", "22\d{3}");
zipRegexps.put("KR", "\d{3}[\-]\d{3}");
zipRegexps.put("CN", "\d{6}");
zipRegexps.put("TW", "\d{3}(\d{2})?");
zipRegexps.put("SG", "\d{6}");
zipRegexps.put("DZ", "\d{5}");
zipRegexps.put("AD", "AD\d{3}");
zipRegexps.put("AR", "([A-HJ-NP-Z])?\d{4}([A-Z]{3})?");
zipRegexps.put("AM", "(37)?\d{4}");
zipRegexps.put("AZ", "\d{4}");
zipRegexps.put("BH", "((1[0-2]|[2-9])\d{2})?");
zipRegexps.put("BD", "\d{4}");
zipRegexps.put("BB", "(BB\d{5})?");
zipRegexps.put("BY", "\d{6}");
zipRegexps.put("BM", "[A-Z]{2}[ ]?[A-Z0-9]{2}");
zipRegexps.put("BA", "\d{5}");
zipRegexps.put("IO", "BBND 1ZZ");
zipRegexps.put("BN", "[A-Z]{2}[ ]?\d{4}");
zipRegexps.put("BG", "\d{4}");
zipRegexps.put("KH", "\d{5}");
zipRegexps.put("CV", "\d{4}");
zipRegexps.put("CL", "\d{7}");
zipRegexps.put("CR", "\d{4,5}|\d{3}-\d{4}");
zipRegexps.put("HR", "\d{5}");
zipRegexps.put("CY", "\d{4}");
zipRegexps.put("CZ", "\d{3}[ ]?\d{2}");
zipRegexps.put("DO", "\d{5}");
zipRegexps.put("EC", "([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?");
zipRegexps.put("EG", "\d{5}");
zipRegexps.put("EE", "\d{5}");
zipRegexps.put("FO", "\d{3}");
zipRegexps.put("GE", "\d{4}");
zipRegexps.put("GR", "\d{3}[ ]?\d{2}");
zipRegexps.put("GL", "39\d{2}");
zipRegexps.put("GT", "\d{5}");
zipRegexps.put("HT", "\d{4}");
zipRegexps.put("HN", "(?:\d{5})?");
zipRegexps.put("HU", "\d{4}");
zipRegexps.put("IS", "\d{3}");
zipRegexps.put("IN", "\d{6}");
zipRegexps.put("ID", "\d{5}");
zipRegexps.put("IL", "\d{5}");
zipRegexps.put("JO", "\d{5}");
zipRegexps.put("KZ", "\d{6}");
zipRegexps.put("KE", "\d{5}");
zipRegexps.put("KW", "\d{5}");
zipRegexps.put("LA", "\d{5}");
zipRegexps.put("LV", "\d{4}");
zipRegexps.put("LB", "(\d{4}([ ]?\d{4})?)?");
zipRegexps.put("LI", "(948[5-9])|(949[0-7])");
zipRegexps.put("LT", "\d{5}");
zipRegexps.put("LU", "\d{4}");
zipRegexps.put("MK", "\d{4}");
zipRegexps.put("MY", "\d{5}");
zipRegexps.put("MV", "\d{5}");
zipRegexps.put("MT", "[A-Z]{3}[ ]?\d{2,4}");
zipRegexps.put("MU", "(\d{3}[A-Z]{2}\d{3})?");
zipRegexps.put("MX", "\d{5}");
zipRegexps.put("MD", "\d{4}");
zipRegexps.put("MC", "980\d{2}");
zipRegexps.put("MA", "\d{5}");
zipRegexps.put("NP", "\d{5}");
zipRegexps.put("NZ", "\d{4}");
zipRegexps.put("NI", "((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?");
zipRegexps.put("NG", "(\d{6})?");
zipRegexps.put("OM", "(PC )?\d{3}");
zipRegexps.put("PK", "\d{5}");
zipRegexps.put("PY", "\d{4}");
zipRegexps.put("PH", "\d{4}");
zipRegexps.put("PL", "\d{2}-\d{3}");
zipRegexps.put("PR", "00[679]\d{2}([ \-]\d{4})?");
zipRegexps.put("RO", "\d{6}");
zipRegexps.put("RU", "\d{6}");
zipRegexps.put("SM", "4789\d");
zipRegexps.put("SA", "\d{5}");
zipRegexps.put("SN", "\d{5}");
zipRegexps.put("SK", "\d{3}[ ]?\d{2}");
zipRegexps.put("SI", "\d{4}");
zipRegexps.put("ZA", "\d{4}");
zipRegexps.put("LK", "\d{5}");
zipRegexps.put("TJ", "\d{6}");
zipRegexps.put("TH", "\d{5}");
zipRegexps.put("TN", "\d{4}");
zipRegexps.put("TR", "\d{5}");
zipRegexps.put("TM", "\d{6}");
zipRegexps.put("UA", "\d{5}");
zipRegexps.put("UY", "\d{5}");
zipRegexps.put("UZ", "\d{6}");
zipRegexps.put("VA", "00120");
zipRegexps.put("VE", "\d{4}");
zipRegexps.put("ZM", "\d{5}");
zipRegexps.put("AS", "96799");
zipRegexps.put("CC", "6799");
zipRegexps.put("CK", "\d{4}");
zipRegexps.put("RS", "\d{6}");
zipRegexps.put("ME", "8\d{4}");
zipRegexps.put("CS", "\d{5}");
zipRegexps.put("YU", "\d{5}");
zipRegexps.put("CX", "6798");
zipRegexps.put("ET", "\d{4}");
zipRegexps.put("FK", "FIQQ 1ZZ");
zipRegexps.put("NF", "2899");
zipRegexps.put("FM", "(9694[1-4])([ \-]\d{4})?");
zipRegexps.put("GF", "9[78]3\d{2}");
zipRegexps.put("GN", "\d{3}");
zipRegexps.put("GP", "9[78][01]\d{2}");
zipRegexps.put("GS", "SIQQ 1ZZ");
zipRegexps.put("GU", "969[123]\d([ \-]\d{4})?");
zipRegexps.put("GW", "\d{4}");
zipRegexps.put("HM", "\d{4}");
zipRegexps.put("IQ", "\d{5}");
zipRegexps.put("KG", "\d{6}");
zipRegexps.put("LR", "\d{4}");
zipRegexps.put("LS", "\d{3}");
zipRegexps.put("MG", "\d{3}");
zipRegexps.put("MH", "969[67]\d([ \-]\d{4})?");
zipRegexps.put("MN", "\d{6}");
zipRegexps.put("MP", "9695[012]([ \-]\d{4})?");
zipRegexps.put("MQ", "9[78]2\d{2}");
zipRegexps.put("NC", "988\d{2}");
zipRegexps.put("NE", "\d{4}");
zipRegexps.put("VI", "008(([0-4]\d)|(5[01]))([ \-]\d{4})?");
zipRegexps.put("PF", "987\d{2}");
zipRegexps.put("PG", "\d{3}");
zipRegexps.put("PM", "9[78]5\d{2}");
zipRegexps.put("PN", "PCRN 1ZZ");
zipRegexps.put("PW", "96940");
zipRegexps.put("RE", "9[78]4\d{2}");
zipRegexps.put("SH", "(ASCN|STHL) 1ZZ");
zipRegexps.put("SJ", "\d{4}");
zipRegexps.put("SO", "\d{5}");
zipRegexps.put("SZ", "[HLMS]\d{3}");
zipRegexps.put("TC", "TKCA 1ZZ");
zipRegexps.put("WF", "986\d{2}");
zipRegexps.put("XK", "\d{5}");
zipRegexps.put("YT", "976\d{2}");
addressKeywords.add("blvd");
addressKeywords.add("st");
addressKeywords.add("street");
addressKeywords.add("lane");
}
测试数据是
List<String> testdata = new ArrayList<>();
testdata.add("1380");
testdata.add("Rio");
testdata.add("Rancho");
testdata.add("Blvd");
testdata.add("SE363");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("Rio");
testdata.add("Rancho");
testdata.add("NM");
testdata.add("87124");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("Wayne");
testdata.add("Stansfield");
testdata.add("i");
testdata.add("CLCS");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("James");
testdata.add("Gordon");
testdata.add("Smith");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("5052");
testdata.add("554");
testdata.add("11500");
testdata.add("121151");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
testdata = new ArrayList<>();
testdata.add("Creative");
testdata.add("Director");
Log.e("!@#", String.valueOf(checkLineForAddress(testdata)));
并输出
E/!@#: 1.0
E/!@#: 1.0
E/!@#: 0.70000005
E/!@#: 0.2
E/!@#: 0.15
E/!@#: 0.15
如您所见,第 3 行是 70% 概率的地址,因为 CLCS
理论上可能是 Bermuda postal code。
您可以根据您的测试数据修改可能性。