Java-提取地址中的省市区,兼容XX区XX小区等地址中出现多个市和区的问题

前段时间碰到一个需要从地址中抽出省市区的需求,然后在省市区中间加上横杠(例如:广东省深圳市罗湖区幸福小区101号转成广东省-深圳市-罗湖区-幸福小区101号),中间百度了下,发现几乎所有人写的方法都无法兼容带XX小区或者XX市XX公司等出现多个市和区的情况,所以优化了一下其他人的方法(注意:该方法必须要求地址带有完整的省市区)。
代码如下:

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

public class AddressCuttingUtil { 

    public static String addressCutting(String address) { 
        if (address.startsWith("北京市") || address.startsWith("天津市") || address.startsWith("上海市") || address.startsWith("重庆市")) { 
            address = address.substring(0, 3) + "市辖区" + address.substring(3);
        }
        String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
        Matcher m = Pattern.compile(regex).matcher(address);
        String province = null, city = null, county = null, town = null, village = null;
        while(m.find()){ 
            province = m.group("province");

            if (province.equals("北京市") || province.equals("天津市") || province.equals("上海市") || province.equals("重庆市")) { 
                city = province;

                county = m.group("city");
                if (county.split("区").length > 1) { 
                    town = county.substring(county.indexOf("区") + 1);
                    county = county.substring(0, county.indexOf("区") + 1);
                    if (town.contains("区")) { 
                        town = town.substring(county.indexOf("区") + 1);
                    }
                } else { 
                    county = m.group("county");
                    if (county.split("区").length > 1) { 
                        town = county.substring(county.indexOf("区") + 1);
                        county = county.substring(0, county.indexOf("区") + 1);
                    }
                }
            } else { 
                city = m.group("city");

                county = m.group("county");
                if (county != null && !"".equals(county)) { 
                    if (county.split("市").length > 1 && county.indexOf("市") < 5) { 
                        town = county;
                        county = county.substring(0, county.indexOf("市") + 1);
                        town = town.substring(county.indexOf("市") + 1);
                    }
                    if (county.split("旗").length > 1) { 
                        town = county;
                        county = county.substring(0, county.indexOf("旗") + 1);
                        town = town.substring(county.indexOf("旗") + 1);
                    }
                    if (county.split("海域").length > 1) { 
                        town = county;
                        county = county.substring(0, county.indexOf("海域") + 2);
                        town = town.substring(county.indexOf("海域") + 2);
                    }
                    if (county.split("区").length > 1) { 
                        town = county;
                        county = county.substring(0, county.indexOf("区") + 1);
                        town = town.substring(county.indexOf("区") + 1);
                    }
            }

            }

            if (province != null && !"".equals(province)) { 
                province = province + "-";
            }

            if (city != null && !"".equals(city)) { 
                city = city + "-";
            }

            if (county != null && !"".equals(county)) { 
                county = county + "-";
            }

            town+=m.group("town");
			if ((county == null || "".equals(county)) && town != null && !"".equals(town)) { 
                town = town + "-";
            }
            village=m.group("village");

        }

        String newMachineAdress = province + city + county + town + village;
        if (newMachineAdress != null && !"".equals(newMachineAdress)) { 
            newMachineAdress = newMachineAdress.replaceAll("null", "");
        }

        if (newMachineAdress == null || "".equals(newMachineAdress)) { 
            newMachineAdress = address;
        }

        return newMachineAdress;
    }

    public static void main(String[] args) { 

        System.out.println(addressCutting("北京市朝阳区幸福小区101"));

        System.out.println(addressCutting("上海市黄浦区鑫浩壹都A座10楼"));

        System.out.println(addressCutting("广东省深圳市罗湖区幸福小区XX区"));

        System.out.println(addressCutting("湖南省长沙市某某县幸福小区"));

        System.out.println(addressCutting("广东省深圳市南山区桃源街道桃源社区高发西路XX号深圳市XX公司X层A区"));

        System.out.println(addressCutting("广东省深圳市南山区北环路第五工业区XX楼三楼A区"));

        System.out.println(addressCutting("天津市和平区和平区南市盒华安大街交口XX有限公司"));

        System.out.println(addressCutting("天津市和平区南市盒华安大街交口XX有限公司"));

        System.out.println(addressCutting("湖北省武汉市洪山区XX街道"));

        System.out.println(addressCutting("湖北省恩施土家族苗族自治州恩施市XX区"));

        System.out.println(addressCutting("内蒙古自治区兴安盟科尔沁右翼前旗XX区"));

        System.out.println(addressCutting("西藏自治区日喀则地区日喀则市XX区"));

        System.out.println(addressCutting("海南省省直辖县级行政单位中沙群岛的岛礁及其海域XX区"));

    }

}

效果如下:

北京市-北京市-朝阳区-幸福小区101
上海市-上海市-黄浦区-鑫浩壹都A座10楼
广东省-深圳市-罗湖区-幸福小区XX区
湖南省-长沙市-某某县-幸福小区
广东省-深圳市-南山区-桃源街道桃源社区高发西路XX号深圳市XX公司X层A区
广东省-深圳市-南山区-北环路第五工业区XX楼三楼A区
天津市-天津市-和平区-和平区南市盒华安大街交口XX有限公司
天津市-天津市-和平区-南市盒华安大街交口XX有限公司
湖北省-武汉市-洪山区-XX街道
湖北省-恩施土家族苗族自治州-恩施市-XX区
内蒙古自治区-兴安盟-科尔沁右翼前旗-XX区
西藏自治区-日喀则地区-日喀则市-XX区
海南省-省直辖县级行政单位-中沙群岛的岛礁及其海域-XX区
    原文作者:子非衣
    原文地址: https://blog.csdn.net/cl617287/article/details/117399666
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞