从客户输入的地址中截取出省市级地址适用全中国,可应对各种杂乱地址

Posted bin-zhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从客户输入的地址中截取出省市级地址适用全中国,可应对各种杂乱地址相关的知识,希望对你有一定的参考价值。

package hello;

import org.apache.commons.lang3.StringUtils;

import java.util.*;
/**
 * @author bin.zhao
 * @description 获取一级+二级地址的字符串
 * @date 2020/1/20
 */
public class Demo {

    private static String AOMEN = "澳门特别行政区";
    private static String XIANGGANG = "香港特别行政区";
    private static String TAIWAN = "台湾";


    public static void main(String[] args) {
        String next = new Scanner(System.in).next();
        String[] s = spiltProvince(next);
        //打印获取到省级地址,市级地址,以及剩余地址
        Arrays.asList(s).forEach(System.out::println);
    }

    //截取出省级地址
    private static String[] spiltProvince(String address) {
        String[] totalAddress = {"", "", ""};
        if (StringUtils.isBlank(address)) {
            return null;
        }
        String sb = "";

        //对香港和澳门进行处理
        if (address.startsWith(AOMEN) || address.startsWith(XIANGGANG)) {
            sb = address.substring(7);
            totalAddress[0] = address.substring(0, 7);
            //截取出二级地址
            if (sb.startsWith("香港岛") || sb.startsWith("氹仔岛") || sb.startsWith("路环岛")) {
                //sb = address.substring(0, 10);
                totalAddress[1] = address.substring(7, 10);
                totalAddress[2] = address.substring(10);
            } else if (sb.startsWith("九龙") || sb.startsWith("新界")) {
                //sb = address.substring(0, 9);
                totalAddress[1] = address.substring(7, 9);
                totalAddress[2] = address.substring(9);
            } else if (sb.startsWith("澳门半岛")) {
                //sb = address.substring(0, 11);
                totalAddress[1] = address.substring(7, 11);
                totalAddress[2] = address.substring(11);
            }

            //对台湾进行处理
        } else if (address.startsWith(TAIWAN)) {
            totalAddress[0] = TAIWAN;
            //截取出二级地址
            boolean city = address.contains("市");
            boolean county = address.contains("县");
            //如果市级的索引小于县的索引,说明是市类型的二级地址,如果市和县都存在,比较市或者县的索引大小
            if ((city && !county) || (city && county && (address.indexOf("市") < address.indexOf("县")))) {
                //sb = address.substring(0, sb.indexOf("市") + 1);
                totalAddress[1] = address.substring(2, address.indexOf("市") + 1);
                totalAddress[2] = address.substring(address.indexOf("市") + 1);
            } else if ((!city && county) || (city && county && (address.indexOf("市") > address.indexOf("县")))) {
                //sb = address.substring(0, address.indexOf("县") + 1);
                totalAddress[1] = address.substring(2, address.indexOf("县") + 1);
                totalAddress[2] = address.substring(address.indexOf("县") + 1);
            }

            //自治区处理
        } else if (address.startsWith("内蒙古自治区") || address.startsWith("宁夏回族自治区") ||
                address.startsWith("西藏自治区") || address.startsWith("广西壮族自治区") ||
                address.startsWith("新疆维吾尔自治区")) {
            sb = getAddress(address, true, false);
            totalAddress[0] = sb.substring(0, sb.indexOf("区") + 1);
            totalAddress[1] = sb.substring(sb.indexOf("区") + 1);
            totalAddress[2] = address.substring(sb.length());
            //直辖市处理
        } else if (address.startsWith("北京市") || address.startsWith("上海市") ||
                address.startsWith("天津市") || address.startsWith("重庆市")) {
            sb = getAddress(address, false, true);
            totalAddress[0] = sb.substring(0, sb.indexOf("市") + 1);
            totalAddress[1] = sb.substring(sb.indexOf("市") + 1);
            totalAddress[2] = address.substring(sb.length());
            //省级类型的一级地址处理
        } else if (address.indexOf("省") != 0) {
            sb = getAddress(address, true, false);
            totalAddress[0] = sb.substring(0, sb.indexOf("省") + 1);
            totalAddress[1] = sb.substring(sb.indexOf("省") + 1);
            totalAddress[2] = address.substring(sb.length());
        }
        return totalAddress;
    }

    //根据指定地址和参数,对不同的一级地址来源进行一级二级地址的截取
    private static String getAddress(String address, boolean state, boolean city) {
        String sb = "";
        Map<Integer, String> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        //自治区的判断
        if (state) {
            if (address.contains("市")) {
                list.add(address.indexOf("市"));
                map.put(address.indexOf("市"), "市");
            }
            if (address.contains("地区")) {
                list.add(address.indexOf("地区"));
                map.put(address.indexOf("地区"), "地区");
            }
            if (address.contains("盟")) {
                list.add(address.indexOf("盟"));
                map.put(address.indexOf("盟"), "盟");
            }
            if (address.contains("州")) {
                list.add(address.indexOf("州"));
                map.put(address.indexOf("州"), "州");
            }
            if (address.contains("级")) {
                list.add(address.indexOf("级"));
                map.put(address.indexOf("级"), "级");
            }
            if (address.contains("新区")) {
                list.add(address.indexOf("新区"));
                map.put(address.indexOf("新区"), "新区");
            }

            //直辖市的判断
        } else if (city) {
            if (address.contains("县")) {
                list.add(address.indexOf("县"));
                map.put(address.indexOf("县"), "县");
            }
            if (address.contains("区")) {
                list.add(address.indexOf("区"));
                map.put(address.indexOf("区"), "区");
            }
        }
        list.sort((o1, o2) -> {
            return o1 - o2;
        });
        String site = "";
        if (list.size() > 0) {
            site = map.get(list.get(0));
            if (site.length() == 2)
                sb = address.substring(0, address.indexOf(site) + 2);
            else
                sb = address.substring(0, address.indexOf(site) + 1);
        }
        return sb;
    }
}

  如果你的地址省级(包含自治区和特别行政区以及直辖市结尾的)和市级(包含市盟地区自治州直辖县级新区等结尾)是选项框让客户选择,后面的是客户自行输入的地址,需要单独取出省市级和剩下的地址可以直接使用数组返回类型,如果需要获取省市地址的长度可以使用注掉的sb返回值;可以处理客户重复输入地址,以及客户输入的多个同级别的地址,判断获取选项框中的地址

以上是关于从客户输入的地址中截取出省市级地址适用全中国,可应对各种杂乱地址的主要内容,如果未能解决你的问题,请参考以下文章

Exacl怎么快递将地址变成省市区?

地址截取省市县(正则表达式)

在excel如何用函数把地址中省份、城市、区县单独提取出来?

中国省市区地址三级联动jQuery插件 案例下载

中国省市县级地址联级

自动识别地址省市区手机号姓名,淘宝的地址自动识别