匹配全国地址的正则表达式工具类

news2024/11/23 18:43:16

正则表达式,匹配全国五级地址工具类,可以直接放在项目中使用~
1级:国 (可忽略不填)
2级:**省、**自治区、**直辖市、**特别行政区、(四个直辖市可忽略不填)
3级:**市、**地区、**自治州、**盟、**自治区、**县、**自治县、
4级:**区、**市、**县、**乡、**民族乡、**镇、**自治县、
5级:**县、**街道、**镇、**团、**岸、**场、**处、**委员会、**区、市、乡、
+详情地址(如:小区
单元
室)

拿到手就可以直接使用啦
如下是运行结果:
在这里插入图片描述


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
      1级:国 (可忽略不填)
      2级:**省、**自治区、**直辖市、**特别行政区、(四个直辖市可忽略不填)
      3级:**市、**地区、**自治州、**盟、**自治区、**县、**自治县、
      4级:**区、**市、**县、**乡、**民族乡、**镇、**自治县、
      5级:**县、**街道、**镇、**团、**岸、**场、**处、**委员会、**区、**市、**乡、
      +详情地址(如:**路**小区**单元**室)
 *
 * @date 2024-10-12 17:30:00
 * @author wangzhen
 */
public class RegionCalcUtil {
    // 匹配国家: 中国 一级地址
    private static final String nation = "中国";
    // 正则表达式: 匹配城市 二级地址
    private static final String provinceRegex = "(?<province>[^省]+省|[^自治区]+自治区|[^特别行政区]+特别行政区|[^直辖市]+直辖市|北京|上海|天津|重庆)";
    // 正则表达式: 匹配区市县 三级地址
    private static final String cityRegex = "(?<city>[^市]+市|[^地区]+地区|[^自治州]+自治州|[^盟]+盟|[^自治区]+自治区|[^县]+县)";
    // 正则表达式: 匹配街道镇等 四级地址
    private static final String areaRegex = "(?<area>[^县]+县|[^区]+区|[^市]+市|[^乡]+乡|[^镇]+镇)";
    // 正则表达式: 匹配街道镇团等 五级地址
    private static final String streetRegex = "(?<street>[^县]+县|[^街道]+街道|[^镇]+镇|[^团]+团|[^岸]+岸|[^场]+场|[^处]+处|[^委员会]+委员会|[^区]+区|[^市]+市|[^乡]+乡)";
    // 正则表达式: 匹配国家
    private static final String detailAddress = "(?<detail>.*)";

    // 各级地址分隔符,如想在各级地址中间带上 - ,就设置为该值
    private static final String separate = "";
    // 该属性是线程安全的
    private static final Pattern pattern;

    static {
        // 初始化pattern
        pattern = Pattern.compile(
                provinceRegex + separate +
                        cityRegex + separate +
                        areaRegex + separate +
                        streetRegex + separate +
                        detailAddress);
    }

    public static void main(String[] args) {
//        山东省-威海市-威海火炬高技术产业开发区-怡园街道威海高区文鑫家园2号楼001室
//        上海市-长宁区-程家桥街道虹桥路2279号温莎花园00幢
//        浙江省-金华市-义乌市-廿三里街道街道龙潭路1号33楼
//        山东省-菏泽市-牡丹区-东城街道青年南路569韵泽园小区1号楼一单元
//        江西省-南昌市-南昌县-东新乡象湖新城金沙大道绿地山庄188栋
        String address = "重庆 重庆市 合川区 钓鱼城街道盘龙路环球家园1栋一单元4_3;";
        System.out.println(addressResolution(address));
    }

    public static Region addressResolution(String address) {
        address = prevProcess(address);
        // 编译正则表达式,注意这里的顺序可能需要调整以避免冲突
        Matcher matcher = pattern.matcher(address);

        if (matcher.find()) {
            // 用于有序存放四级地址
            Region region = new Region();
            region.setNation(nation);
            region.setProvince(removeStr(matcher.group("province")));
            region.setCity(removeStr(matcher.group("city")));
            region.setArea(removeStr(matcher.group("area")));
            region.setStreet(removeStr(matcher.group("street")));
            region.setDetail(removeStr(matcher.group("detail")));
            return region;
        }
        return null;
    }

    public static LevelRegion addressResolutionToLevel(String address){
        Region region = addressResolution(address);
        if(region == null){
            return null;
        }
        LevelRegion levelRegion = new LevelRegion();
        levelRegion.setFirstRegion(region.getNation());
        levelRegion.setSecondRegion(region.getProvince());
        levelRegion.setThirdRegion(region.getCity());
        levelRegion.setFourthRegion(region.getArea());
        levelRegion.setFifthRegion(region.getStreet());
        levelRegion.setDetail(region.getDetail());
        return levelRegion;
    }
    private static String removeStr(String str){
        if(str == null){
            return null;
        }
        return str.trim().
                replaceAll("-", "")
                .replaceAll(",", "")
                .replaceAll("\\.", "")
                .replace(" ", "");
    }

    private static String prevProcess(String address){
        // 不填四个直辖市,给补充上
        if(address.startsWith("上海市")){
            address = "上海" + address;
        }else if(address.startsWith("北京市")){
            address = "北京" + address;
        }else if(address.startsWith("天津市")){
            address = "天津" + address;
        }else if(address.startsWith("重庆市")){
            address = "重庆" + address;
        }
        // 将国家去掉
        if(address.startsWith(nation)){
            address = address.substring(nation.length());
        }
        return address;
    }

    @Getter
    @Setter
    @ToString
    public static class Region{
        /**
         * 一级地址:中国
         */
        private String nation;
        /**
         * 二级地址:省、
         */
        private String province;
        /**
         * 三级地址值:区市县
         */
        private String city;
        /**
         * 四级地址:镇等
         */
        private String area;
        /**
         * 五级地址:街道等
         */
        private String street;
        /**
         * 后续地址详情
         */
        private String detail;
    }

    @Getter
    @Setter
    @ToString
    public static class LevelRegion{
        /**
         * 一级地址:中国
         */
        private String firstRegion;
        /**
         * 二级地址:省、
         */
        private String secondRegion;
        /**
         * 三级地址值:区市县
         */
        private String thirdRegion;
        /**
         * 四级地址:镇等
         */
        private String fourthRegion;
        /**
         * 五级地址:街道等
         */
        private String fifthRegion;
        /**
         * 后续地址详情
         */
        private String detail;
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码和零代码开发方式如何改变软件开发行业?

低代码和零代码开发方式如何改变软件开发行业&#xff1f; 随着技术的进步和数字化转型的加速&#xff0c;软件开发行业正在经历一场革命。在这场革命中&#xff0c;低代码和零代码平台正逐渐成为企业开发应用的重要工具。它们以其简单易用的特性&#xff0c;极大地降低了软件…

面试笔记-js基础篇

1、因为在 JS 的最初版本中&#xff0c;使用的是 32 位系统&#xff0c;为了性能考虑使用低位存储了变量的类型信息&#xff0c;000 开头代表是对象&#xff0c;然而 null 表示为全零&#xff0c;所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了&#xff…

计算机网络第1章(概述)万字笔记详细版

1.1、计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水&#xff0c;电&#xff0c;煤气这些基础设施一样&#xff0c;成为我们生活中不可或缺的一部分 我国互联网发展状况 中国互联网络信息中心CNNIC 1.2、…

万字详解AI实践,零手写编码用AI完成开发 + 数据清洗 + 数据处理 的每日新闻推荐,带你快速成为AI大神

用AIdify完成前后端开发数据处理和数据清洗。 引言数据获取和数据处理dify构建workflow进行数据清洗前端页面构建和前后端交互总结 引言 AI时代对开发人员的加强是非常明显的&#xff0c;一个开发人员可以依靠AI横跨数个自己不熟悉的领域包括前后端、算法等。让我们来做个实践…

模板和静态文件

模板和静态文件 1、templates模板2、静态文件2.1、static目录2.2、引用静态文件 1、templates模板 "templates"目录用于存放模板文件&#xff0c;通常是用于动态生成页面的文件。 在app01目录下创建templates文件夹&#xff0c;html文件均保存在templates中 在urls.p…

Linux的hadoop集群部署

1.hadoop是一个分布式系统基础架构,主要解决海量数据额度存储与海量数据的分析计算问题 hdfs提供存储能力,yarn提供资源管理能力,MapReduce提供计算能力 2.安装 一:调整虚拟机内存,4G即可 二:下载安装包 网址:https://mirrors.aliyun.com/apache/hadoop/common/hadoop-3.4.0/…

【文心智能体 AI大师工坊】『​​​​​​​人间夸夸机』情感类智能体开发调优全过程详解

&#x1f680;『人间夸夸机』点击前往体验&#xff1a;https://snhoio.smartapps.baidu.com/?_swebScene3611000000000000 最近参加了百度文心智能体平台AI大师工坊&#x1f389;活动&#xff0c;在这个活动中&#xff0c;我利用文心平台提供的各种插件、大模型等工具&#xf…

Linux内核USB3.0驱动框架分析--USB主机控制器hcd驱动分析

一&#xff0c;概述 usb主机控制器驱动一般以platform的形式将驱动注册进内核&#xff0c;&#xff0c;因此我们需要从前面一篇文章的框图说起。主要分析下图中橙色部分的内容。 二&#xff0c;usb主机控制器相关函数 2.1 usb_create_hcd 我们来看一下usb_create_hcd函数&a…

如何成为 Rust 核心贡献者?Rust 开发的核​​心是什么?Rust 重要技术专家揭秘

10 月 17 - 18日&#xff0c;由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会&#xff0c;本次活动邀请了 60 多位国际开源专家&#xff0c;汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…

图像增强论文精读笔记-Kindling the Darkness: A Practical Low-light Image Enhancer(KinD)

1. 论文基本信息 论文标题&#xff1a;Kindling the Darkness: A Practical Low-light Image Enhancer 作者&#xff1a;Yonghua Zhang等 发表时间和期刊&#xff1a;2019&#xff1b;ACM MM 论文链接&#xff1a;https://arxiv.org/abs/1905.04161 2. 研究背景和动机 现有…

C++入门基础知识110—【关于C++ if...else 语句】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C if...else 语句的相关内容&#xff01…

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)

好久没写SD了&#xff0c;今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程&#xff08;引合和見積&#xff08;询价和报价&#xff09;&#xff09; - 数据流的概念&#xff0c;主要就是后传票可以参照前传票&#xff0c;以实现数据的流动&#xff0c;减少输入 - Co…

PHP游泳馆会员管理系统-计算机毕业设计源码86627

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于游泳馆会员管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了游泳馆会员管理系统&#xff0c;它彻底改…

二分查找法 ← Python实现

【二分查找法】 ★ 二分查找&#xff0c;是一种效率较高的查找方法。但是&#xff0c;二分查找要求元素按关键字有序排列。 ★ 二分查找每一次查找都使查找范围缩小一半&#xff0c;与顺序查找相比&#xff0c;很显然会提高查找效率。为了标记查找过程中每一次的查找区间&#…

自动猫砂盆真的有必要吗?买自动猫砂盆不看这四点小心害死猫。

现在越来越多铲屎官选择购买自动猫砂盆来代替自己给猫咪铲屎&#xff0c;可是自动猫砂盆真的有必要吗&#xff1f;要知道&#xff0c;在现在忙碌的生活中&#xff0c;有很多人因为工作上的忙碌而不小心忽视了猫咪&#xff0c;猫咪的猫砂盆堆满粪便&#xff0c;要知道猫砂盆一天…

windows如何设置右键新建文档

1. windows如何设置右键新建文档 文章目录 1. windows如何设置右键新建文档1.1. 注意注意注意1.2. 参考资料1.3. 注册列表中各项的意思1.4. 右键新建文档1.4.1. 新建文件夹快捷键1.4.2. 新建txt文件快捷键1.4.3. 新建Word文档快捷键1.4.4. 新建PowerPoint文档快捷键1.4.5. 新建…

Linux基础(五):linux目录配置

1.Linux系统目录 不同的Linux发布版本的目录都是类似的&#xff0c;这是因为Linux系统的目录配置有一个大概的标准——Filesystem Hierarchy Standard&#xff08; FHS&#xff09;。FHS规定了目录有4种交互形态&#xff1a; ①可分享的&#xff1a; 可以分享给其他系统挂载使…

【优选算法】(第三十五篇)

目录 验证栈序列&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 N叉树的层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 验证栈序列&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;L…

校园网网页认证设备限制环境下基于OpenWRT的路由器选型与解决方案

校园网环境下基于OpenWRT的路由器选型与解决方案 网页认证(锐捷认证)解除校园网设备限制,路由器选型和解决方案 openwrt 我们学校校园网一个账号只能登录两台设备&#xff0c;多了直接就退出联网状态&#xff0c;然后校园网是基于锐捷认证进行认证的&#xff0c;然后通过ment…

【closerAI ComfyUI】爹妈都认不出的美女模糊照片,这个高清放大模型竟然能还原出来!这个AI模型我给满分

兄弟们&#xff0c;太离谱了&#xff0c;大家都知道FLUX模型的牛逼&#xff0c;现在基于FLUX的生态越发成熟&#xff0c;但一张模糊到五官都不能辨认的图片&#xff0c;通过AI模型的计算&#xff0c;竟然能还原出来。当然&#xff0c;这里我们的测试是过于极端。一般模糊一点的…