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

2023-10-31

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课程学习一遍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java正则工具类从地址中提取省市区 的相关文章

随机推荐

  • 一个40岁程序员的经历

    有好几年没有上CSDN了 最近密码泄露事件 才让人想起久违的csdn 还好 通过注册邮箱顺利的找回了密码 十年前的时候 常在csdn潜水的老人们 现在还有人再来csdn吗 估计大部分都已经转行 当管理者或者当老板了吧 仍然做软件的可能只是极
  • 毕业设计成品网站集锦

    帮大家汇总下 今年比较热门的毕业设计选题 毕业设计成品网站的模板 适用性比较强 性价比也比较高 大家可以参考下 一 在线购物商城 題目 购物网站毕业设计 二 旅游网站 題目 基于web的旅游网站毕业设计
  • linux c语言 创建线程任务

    include
  • 使用AJAX修改把商品添加到购物车

    使用AJAX修改把商品添加到购物车 protected void ajaxAddItem HttpServletRequest req HttpServletResponse resp throws ServletException IOE
  • Vue2使用过渡标签transition使用动画

    注意 动画必须使用v if v show配合 1 Vue2配Css3实现 我们需要使用 过渡 标签
  • clickhouse There is no supertype for types UInt64, Float64

    There is no supertype for types UInt64 Float64 进行union all操作的时候 发现有两个字段名称相同 但是类型不同 所以出现了这个字段 如下 解决方案 统一转Float64类型 因人而异
  • 单片机毕业设计 遥控小车设计与实现

    文章目录 1 简介 2 主要器件与实现 2 1 电机驱动模块 2 2 蓝牙模块 2 3 蓝牙调试APP 3 实现效果 5 部分参考代码 6 最后 1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 基于单片机的遥控小车设计与实现
  • 注解@Lazy

    注解 Lazy 1 注解由来 Lazy 注解是 Spring 框架提供的一种机制 用于延迟初始化 Bean 它可以推迟 Bean 的初始化时机 从而优化应用程序的性能和资源利用 2 注解示例 java复制代码 Component Lazy
  • git回退--使用TortoiseGit小乌龟【我有一颗后悔药,服用说明图文详细,请对症下药】

    hi 你好 见到你很开心 我听到你的呼唤啦 你说你一不小心做错事了 我这刚好有一颗后悔药 说不定等你吃完 就能回到事情发生前啦 祝你好运o 下面我给大家介绍此款后悔药功效 请对症下药 药效 可穿越回到 之前某一次提交的时刻 本地与远端分支
  • SpringBoot中使用@Insert、@Update实现批量新增、更新

    一 使用 Insert批量新增 数据库原始表数据 数据层接口 批量新增 Insert
  • 有向图的拓扑排序

    给定一个 n 个点 m 条边的有向图 点的编号是 1 到 n 图中可能存在重边和自环 请输出任意一个该有向图的拓扑序列 如果拓扑序列不存在 则输出 1 若一个由图中所有点构成的序列 A 满足 对于图中的每条边 x y x 在 A 中都出现在
  • Explain各个字段的含义

    文章目录 TOC 1 expanin的结果示例 2 各个字段的含义 1 id 2 select type 3 table 4 type 重要 我们利用索引查找出来的记录显示 5 possible keys 6 key 7 key len 8
  • VUE3 之 生命周期函数

    目录 1 概述 2 VUE3 生命周期函数介绍 3 代码例子 4 综述 5 个人公众号 1 概述 老话说的好 天生我材必有用 千金散尽还复来 言归正传 今天我们来聊一下 VUE 的生命周期函数 所谓生命周期函数 就是在某一条件下被自动触发的
  • BLE MESH组网(一)简介和基本概念

    BLE MESH组网 一 BLE MESH简介 BLE MESH来源 BLE MESH用处 BLE MESH的通讯方式 管理洪水 市场内蓝牙设备支持 安全性 BLE MESH协议栈模型 BLE MESH基本概念 节点 元素 模型和状态 地址
  • vue+饿了么 点击当前元素之外收起弹框

    v clickoutside指令解决此问题 先引入 import Clickoutside from element ui src utils clickoutside export default directives Clickouts
  • linux系统部署jenkins详细教程

    一 Linux环境 1 下载war包 官网下载地址 https get jenkins io war stable 2 332 4 jenkins war 2 将war包上传至服务器 创建目录 home ubuntu jenkins 上传w
  • AndroidStudio的一些代码恢复功能

    我一个好兄弟 也是一个程序员 一天写代码的时候 他要删除一个apk文件 点击delete的时候 Androidstudio卡了一下 就出问题了 导致他的所有app下面的所有东西全没了 代码 jar包全没了 用过as的都知道 在as中删除文件
  • vulnhub-VULNOS: 2渗透测试靶场

    靶场下载地址VulnOS 2 VulnHub 靶场文件时virtualBox 虚拟机的靶场 vm无法导入 安装vbox之后直接双击靶场文件导入 之后设置网卡为默认桥接模式即可 开机 信息收集 使用nmap 192 168 2 0 24 进行
  • Dockerfile中的CMD和ENTRYPOINT有什么区别?

    本文翻译自 What is the difference between CMD and ENTRYPOINT in a Dockerfile In Dockerfiles there are two commands that look
  • Java正则工具类从地址中提取省市区

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