=Start=
缘由:
最近对这一块的内容比较感兴趣,所以收集整理了一些这方面的内容,方便以后有需要的时候参考和使用。
正文:
参考解答:
这个功能说白了其实就是字符串处理,但因为国内的省市区地址可能性非常多,所以不方便用常规的字符串方法进行处理,这时使用正则表达式是一个不错的选择(只能保证提取结果的大概准确,因为实际生活中的情况各种各样,很难完全匹配,除非在填写输入的时候就进行严格控制,但这在大部分情况下都是不现实的)。
这里一方面是为了实现信息提取的功能,另一方面也是想借此顺便熟悉一下正则表达式的捕获组的使用。
因为用到的是正则表达式的捕获组的概念,先简单整理一下捕获组的概念和用法:
捕获组分为:
普通捕获组(Expression)命名捕获组(?Expression)
普通捕获组:
从正则表达式左侧开始,每出现一个左括号”(“记做一个分组,分组编号从 1 开始。0 代表整个表达式。即,(Expression)。
命名捕获组:
每个以左括号开始的命名捕获组(?Expression),都紧跟着 ?,而后才是正则表达式。
非捕获组:
在左括号后紧跟 ?:,而后再加上正则表达式,构成非捕获组 (?:Expression)。
然后再整理一下中国各省级城市列表:
34个省级行政单位:23个省、4个直辖市、2个特别行政区、5个自治区。
我国共有34个省级行政区,其中:· 直辖市有4个:北京市(京)、天津市(津)、上海市(沪)、重庆市(渝)。· 特别行政区有2个:香港特别行政区和澳门特别行政区。· 自治区有5个:新疆维吾尔自治区(新)、宁夏回族自治区(宁)、西藏自治区(藏)、广西壮族自治区(桂)、内蒙古自治区(内蒙古)。· 省份有23个:河北省(冀)、山西省(晋)、辽宁省(辽)、吉林省(吉)、黑龙江省(黑)、江苏省(苏)、浙江省(浙)、安徽省(皖)、福建省(闽)、江西省(赣)、山东省(鲁)、河南省(豫)、湖北省(鄂)、湖南省(湘、)广东省(粤)、海南省(琼)、四川省(川、蜀)、贵州省(黔、贵)、云南省(滇、云)、陕西省(陕、秦)、甘肃省(甘、陇)、青海省(青)、台湾省(台)。
最后再把网上找到的Java代码片段放一下,方便使用(也可以按需进行微调):
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AddressResolutionUtil {
public static String regex = "(?
public static Pattern pattern = Pattern.compile(regex);
public static List
Matcher m = pattern.matcher(address);
String province = null, city = null, county = null, town = null, village = null;
List
Map
while(m.find()) {
row = new LinkedHashMap
province = m.group("province");
row.put("province", province==null ? "" : province.trim());
city = m.group("city");
row.put("city", city==null ? "" : city.trim());
county = m.group("county");
row.put("county", county==null ? "" : county.trim());
town = m.group("town");
row.put("town", town==null ? "" : town.trim());
village = m.group("village");
row.put("village", village==null ? "" : village.trim());
table.add(row);
}
return table;
}
public static void main(String[] args) {
System.out.println(addressResolution("湖北省武汉市洪山区"));
System.out.println(addressResolution("湖北省恩施土家族苗族自治州恩施市"));
System.out.println(addressResolution("北京市市辖区朝阳区"));
System.out.println(addressResolution("内蒙古自治区兴安盟科尔沁右翼前旗"));
System.out.println(addressResolution("西藏自治区日喀则地区日喀则市"));
System.out.println(addressResolution("海南省省直辖县级行政单位中沙群岛的岛礁及其海域"));
System.out.println(addressResolution("陕西省延安市宝塔区麦克大厦"));
}
}
参考链接:
java从地址串中解析提取省市区-完美匹配中国所有地址 https://blog.csdn.net/superSubfn/article/details/80290491
java 从字符串中提取省、市、区、镇、乡等区域名称(包含少数民族地区) https://blog.csdn.net/qq_40083897/article/details/83048587
用正则表达式切割详细地址中的省、市、区 https://blog.csdn.net/qq_38584262/article/details/86302509
JAVA实现地址解析功能 https://blog.csdn.net/renfng/article/details/94738164
中国各省份城市列表 http://www.maps7.com/china_province.php
Java 正则表达式 https://www.runoob.com/java/java-regular-expressions.html
JAVA正则表达式语法示例与语法大全 https://www.w3cschool.cn/regexp/x9hf1pq9.html
[疯狂Java]正则表达式:捕获组、反向引用、捕获组命名 https://blog.csdn.net/Lirx_Tech/article/details/51721491
深入入门正则表达式(java) – 命名捕获 https://blog.csdn.net/su1216/article/details/49407381
Java 正则表达式的捕获组(capture group) https://www.runoob.com/w3cnote/java-capture-group.html
正则表达式的捕获组(Java) https://www.cnblogs.com/lyy-blog/p/9817361.html
=END=