Java正则工具类从地址中提取省市区

Java正则工具类从地址中提取省市区

最近有个需求,从一串地址中提取出省市区,然后开始寻找解决方案,最终通过网上一些正则,再加上自己改动的,貌似弄成一个比较匹配的工具类,其中代码如下,有需要的可以参考下。

其中一些自治区还有直辖市均已兼容,自己测试的代码也好多emm


import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/** * @author zhan * @date 2020/04/08 17:19:14 * @description 地址解析工具类 */
public class AddressUtil { 
    /** * 解析地址 * @param address * @return */
    public static Map<String,String> getAddressInfo(String address) { 
        //1级 省 自治区 2级 市 自治州 地区 3级:区县市旗(镇?)
        String province = null, city = null, provinceAndCity = null, town = null ;
        Map<String, String> row = new LinkedHashMap<>();
        List<Map<String, String>> table = new ArrayList<>();
        Map<String,String> resultMap = new HashMap<>(4);

        if (address.startsWith("香港特别行政区")) { 
            resultMap.put("province","香港");
            return resultMap;
        } else if (address.contains("澳门特别行政区")) { 
            resultMap.put("province","澳门");
            return resultMap;
        } else if (address.contains("台湾")) { 
            resultMap.put("province","台湾");
            return resultMap;
        } else { 
            //普通地址
            String regex = "((?<provinceAndCity>[^市]+市|.*?自治州|.*?区|.*县)(?<town>[^区]+区|.*?市|.*?县|.*?路|.*?街|.*?道|.*?镇|.*?旗)(?<detailAddress>.*))";
            Matcher m = Pattern.compile(regex).matcher(address);
            while (m.find()) { 
                provinceAndCity = m.group("provinceAndCity");
                String regex2 = "((?<province>[^省]+省|.+自治区|上海市|北京市|天津市|重庆市|上海|北京|天津|重庆)(?<city>.*))";
                Matcher m2 = Pattern.compile(regex2).matcher(provinceAndCity);
                while (m2.find()) { 
                    province = m2.group("province");
                    row.put("province", province == null ? "" : province.trim());
                    city = m2.group("city");
                    row.put("city", city == null ? "" : city.trim());
                }
                town = m.group("town");
                row.put("town", town == null ? "" : town.trim());
                table.add(row);
            }
        }
        if (table != null && table.size() > 0) { 
            if (StringUtils.isNotBlank(table.get(0).get("province"))) { 
                province = table.get(0).get("province");
                //对自治区进行处理
                if (province.contains("自治区")) { 
                    if (province.contains("内蒙古")) { 
                        province = province.substring(0,4);
                    }  else { 
                        province = province.substring(0,3);
                    }

                }
            }
            if (StringUtils.isNotBlank(province)) { 
                if (StringUtils.isNotBlank(table.get(0).get("city"))) { 
                    city = table.get(0).get("city");
                    if (city.equals("上海市") || city.equals("重庆市") || city.equals("北京市") || city.equals("天津市")) { 
                        province = table.get(0).get("city");
                    }
                }

                else if (province.equals("上海市") || province.equals("重庆市") || province.equals("北京市") || province.equals("天津市")) { 
                    city = province;
                }
                if (StringUtils.isNotBlank(table.get(0).get("town"))) { 
                    town = table.get(0).get("town");
                }
                province = province.substring(0,province.length() - 1);

            }

        } else { 
            return resultMap;
        }
        resultMap.put("province",province);
        resultMap.put("city",city);
        resultMap.put("district",town);

        return resultMap;
    }

    public static void main(String[] args) { 
// Map<String, String> map = getAddressInfo("广东省深圳市南山区东滨路205号");
// Map<String, String > map = getAddressInfo("上海市虹口区飞虹路518号");
// Map<String, String > map = getAddressInfo("河北省廊坊市三河市燕顺路1140号");
// Map<String, String> map = getAddressInfo("香港特别行政区油尖旺区广华街58号");
// Map<String, String> map = getAddressInfo("黑龙江省大兴安岭地区呼玛县合兴街");
// Map<String, String> map = getAddressInfo("江苏省南京市江宁区202县道");
// Map<String, String> map = getAddressInfo("海南省陵水黎族自治县陵水黎族自治县提蒙大道215号");

// Map<String, String> map = getAddressInfo("山东省烟台市龙口市062县道");
// Map<String, String> map = getAddressInfo("新疆维吾尔自治区乌鲁木齐市沙依巴克区阿里山街");
// Map<String, String> map = getAddressInfo("内蒙古自治区呼伦贝尔市鄂温克族自治旗");
        Map<String, String> map = getAddressInfo("日本滋贺县甲賀市県道507号線");

// Map<String, String> map = getAddressInfo("广东省东莞市仍然市振华路290号");
        map.entrySet().stream().forEach(item -> { 
            System.out.println(item.getKey()+":"+item.getValue());
        });

    }
}

另外,由于线上有几百万数据,需要重新去遍历然后为每一条数据进行清洗,将地址拆分出省市区三个字段,于是又写了一个接口专门来更改数据。

具体方法是通过批量修改的方式,这样比较快,还有需要设置间隔数,避免OOM。

最近感觉SQL的学习还是比较弱,需要加强,过段时间准备把极客时间的SQL课程学习一遍。

    原文作者:ForeverSen
    原文地址: https://blog.csdn.net/qq_43699339/article/details/105443874
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞