java白嫖同事的从身份证里面提取省市区地址详细信息的工具类代码
/*** @author sunpeiyang* @date 2024/10/21 16:35*/
@Slf4j
public class MiTaAddressExtractor {/*** 获取详细地址** @param fullAddress 身份证完整地址*/public static String getDetailedAddress(String fullAddress) {String[] addressArrays = spliceDetailedAddress(fullAddress);return addressArrays[addressArrays.length - 1];}/*** 获取省市区地址,如:安徽省合肥市包河区** @param fullAddress 身份证完整地址*/public static String getPcaAddress(String fullAddress) {String[] addressArrays = spliceDetailedAddress(fullAddress);StringBuilder areaBuffer = new StringBuilder();for (int i = 0; i < addressArrays.length - 1; i++) {if (StringUtils.isNotEmpty(addressArrays[i])) {areaBuffer.append(addressArrays[i]);}}return areaBuffer.toString();}/*** 身份证完成地址拆分为[省、市、区、详细地址]数组,如:[安徽省, 合肥市, 包河区, 幸福大街001号]** @param fullAddress 身份证完整地址*/public static String[] spliceDetailedAddress(String fullAddress) {String[] arr = new String[4];try {String tempStr = fullAddress;// 省String province = null;int provinceIdx = processProvince(tempStr);if (provinceIdx > -1) {province = tempStr.substring(0, provinceIdx + 1);tempStr = tempStr.substring(provinceIdx + 1);}// 市String city = null;int cityIdx = processCity(tempStr);if (cityIdx > -1) {city = tempStr.substring(0, cityIdx + 1);tempStr = tempStr.substring(cityIdx + 1);}// 区String county = null;int countyIdx = processCounty(tempStr);if (countyIdx > -1) {county = tempStr.substring(0, countyIdx + 1);tempStr = tempStr.substring(countyIdx + 1);}String street = tempStr;arr[0] = province;arr[1] = city;arr[2] = county;arr[3] = street;} catch (Exception e) {log.error("身份证详细地址转义失败:{}", e.getMessage());}return arr;}/*** 拆分身份证完整地址中的省份信息** @param address 地址*/private static int processProvince(String address) {int[] idx = new int[3];int provinceIdx;if ((provinceIdx = address.indexOf("省")) > -1) {idx[0] = provinceIdx;}if ((provinceIdx = address.indexOf("市")) > -1) {idx[1] = provinceIdx;}if ((provinceIdx = address.indexOf("区")) > -1) {idx[2] = provinceIdx;}Arrays.sort(idx);for (int j : idx) {if (j > 0) {return j;}}return provinceIdx;}/*** 拆分身份证完整地址中的市区/县/自治州信息** @param address 地址*/private static int processCity(String address) {int[] idx = new int[7];int cityIdx = -1;if ((cityIdx = address.indexOf("县")) > -1) {idx[0] = cityIdx;}if ((cityIdx = address.indexOf("自治州")) > -1) {idx[1] = cityIdx + 2;}if ((cityIdx = address.indexOf("市辖区")) > -1) {idx[2] = cityIdx + 2;}if ((cityIdx = address.indexOf("市")) > -1) {idx[3] = cityIdx;}if ((cityIdx = address.indexOf("区")) > -1) {idx[4] = cityIdx;}if ((cityIdx = address.indexOf("地区")) > -1) {idx[5] = cityIdx + 1;}if ((cityIdx = address.indexOf("盟")) > -1) {idx[6] = cityIdx;}Arrays.sort(idx);for (int j : idx) {if (j > 0) {return j;}}return cityIdx;}/*** 拆分身份证完整地址中的县/旗/岛信息** @param address 地址*/private static int processCounty(String address) {int[] idx = new int[6];int countyIdx;if ((countyIdx = address.indexOf("县")) > -1) {idx[0] = countyIdx;}if ((countyIdx = address.indexOf("旗")) > -1) {idx[1] = countyIdx;}if ((countyIdx = address.indexOf("海域")) > -1) {idx[2] = countyIdx + 1;}if ((countyIdx = address.indexOf("市")) > -1) {idx[3] = countyIdx;}if ((countyIdx = address.indexOf("区")) > -1) {idx[4] = countyIdx;}if ((countyIdx = address.indexOf("岛")) > -1) {idx[5] = countyIdx;}Arrays.sort(idx);for (int j : idx) {if (j > 0) {return j;}}return countyIdx;}/*** 身份证地址提取省市区** @param fullAddress 身份证完整地址*/public static Map<String, String> addressResolution(String fullAddress) {// 定义正则String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<area>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<detail>.*)";Matcher matcher = Pattern.compile(regex).matcher(fullAddress);String province, city, area, town, detail;Map<String, String> map = new LinkedHashMap<>();while (matcher.find()) {province = matcher.group("province");map.put("province", StringUtils.isEmpty(province) ? "" : province.trim());city = matcher.group("city");map.put("city", StringUtils.isEmpty(city) ? "" : city.trim());area = matcher.group("area");map.put("area", StringUtils.isEmpty(area) ? "" : area.trim());town = matcher.group("town");map.put("town", StringUtils.isEmpty(town) ? "" : town.trim());detail = matcher.group("detail");map.put("detail", StringUtils.isEmpty(detail) ? "" : detail.trim());}return map;}public static void main(String[] args) {String address1 = "北京市北京市东城区测试基地址";String address2 = "内蒙古自治区呼伦贝尔市鄂温克族自治旗额尔古纳市阿尔山北路xxx号蒙古民族文化博物馆x楼xx展厅";String address3 = "广东省广州市番禺区沙湾镇大巷涌路xxx号";System.out.println("地址提取省市区:" + addressResolution(address1));System.out.println("地址提取省市区:" + addressResolution(address2));System.out.println("地址提取省市区:" + addressResolution(address3));}
}
类的功能解释
MiTaAddressExtractor
类的主要功能是从身份证完整地址中提取并拆分出省、市、区和详细地址信息。具体来说,这个类提供了以下几个核心功能:
获取详细地址:
方法:getDetailedAddress(String fullAddress)
功能:从完整的身份证地址中提取详细的街道地址部分。
获取省市区地址:
方法:getPcaAddress(String fullAddress) 功能:从完整的身份证地址中提取并拼接省、市、区地址部分。
拆分详细地址:
方法:spliceDetailedAddress(String fullAddress)
功能:将完整的身份证地址拆分为省、市、区和详细地址四个部分,并返回一个包含这四个部分的数组。
地址解析:
方法:addressResolution(String fullAddress)
功能:使用正则表达式解析完整的身份证地址,提取省、市、区、镇和详细地址部分,并返回一个包含这些部分的映射。
辅助方法:
方法:processProvince(String address) 功能:查找地址中的省、市、区关键字,返回第一个找到的关键字的位置。
方法:processCity(String address)
功能:查找地址中的县、自治州、市辖区、市、区、地区、盟关键字,返回第一个找到的关键字的位置。 方法:processCounty(String
address) 功能:查找地址中的县、旗、海域、市、区、岛关键字,返回第一个找到的关键字的位置。
主方法:
方法:main(String[] args) 功能:测试 addressResolution 方法,输出三个示例地址的解析结果。
总结
MiTaAddressExtractor
类主要用于处理和解析身份证地址信息,提供多种方法来提取和拆分地址的不同部分,以便在应用程序中方便地使用这些地址信息。这个类在处理用户输入的地址数据时非常有用,特别是在需要对地址进行标准化处理的场景中。
相关文章:
java白嫖同事的从身份证里面提取省市区地址详细信息的工具类代码
/*** author sunpeiyang* date 2024/10/21 16:35*/ Slf4j public class MiTaAddressExtractor {/*** 获取详细地址** param fullAddress 身份证完整地址*/public static String getDetailedAddress(String fullAddress) {String[] addressArrays spliceDetailedAddress(fullAd…...
计算机网络基本架构示例2
一、企业内部网络架构 在一个中型企业中,通常会有以下的网络架构: - 核心层:由高性能的核心交换机组成,负责快速转发大量数据。例如采用具有高带宽和冗余功能的三层交换机,确保整个网络的稳定运行。它连接着各个部门的…...
无人机之室内定位技术篇
无人机的室内定位技术是实现无人机在室内环境中精准导航和定位的关键技术。由于室内环境复杂,卫星导航系统(如GPS)无法提供有效的信号,因此需要依赖其他室内定位技术。 一、主要技术类型 基于视觉的定位技术 原理:利…...
在ubuntu20.04中输入不存在shell命令时,报错ModuleNotFoundError的解决方案
这个问题出现过好几次,每次都比较困扰,以下的解决方案比较适合: 当我输入ubuntu无法识别的命令的时候,正常来说应该提示类似于 command not found 之类的字眼,但是系统确报了如下错误: Traceback (most r…...
互联网语言 互联网开发 互联网架构
JAVA和PHP是两种广泛应用于互联网开发的编程语言,它们在多个维度上展现出显著的不同。 JAVA是一种面向对象的编程语言,以其严谨、高效的特性而著称。JAVA的语法结构复杂且规范,强调封装、继承和多态等面向对象原则,适合构建大型企…...
解决MybatisPlus updateById更新数据时将没传的数据也更新成了null
首先,MybatisPlus在调用自带的更新接口updateById时,如果没加任何配置,默认是不会将前端没传的数据也更新成null的。即MyBatisPlus不会更新传入实体中为null的字段,只会更新设置了不为null的值。 如果发现没传的也更新成null了的话…...
OpenWRT 和 Padavan 路由器配置网络打印机 实现远程打印
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前有给大家介绍过 Armbian 安装 CUPS 作为打印服务器,像是 N1 盒子、玩客云,甚至是随身 WiFi 都可以通过 CUPS 来进行打印。但是有些朋友不想专门为打印机添置一个设备࿰…...
R语言机器学习教程大纲
文章目录 介绍机器学习算法监督学习Supervised Learning分类Classification回归Regression 无监督学习 Unsupervised Learning聚类 Clustering降纬 Dimensionality Reduction相关Association 强化学习Reinforcement Learning模型自由 Model-Free Methods模型驱动 Model-Based M…...
java如何部署web后端服务
java如何部署web后端服务 简单记录一下,方便后续使用。 部署流程 1.web打包 2.关掉需要升级的运行中的服务 /microservice/hedgingcustomer-0.0.1-SNAPSHOT/conf/bin/ 执行脚本 sh shutdown.sh 3.解压文件 返回到/microservice 将升级包上传到该路径&#x…...
第八课 Vue中的v-bind指令
Vue中的v-bind指令 v-bind用于属性绑定,使得属性可以动态修改 v-bind动态修改class 动态修改的class名来源于data对象,而非手动给定 基础示例 <style>div{width: 100px;height: 100px;border: 3px solid #000;}.bg {background: red;}</sty…...
基于STM32的智能电能表设计
引言 本项目设计了一个基于STM32的智能电能表系统,能够实时测量家用电器的电压、电流、功率和电能消耗。该系统集成了电压电流传感器、显示屏、通信模块等,能够实现电能测量、数据显示、数据存储和远程传输功能,适用于家庭、工业等场景的电能…...
开启学习与探索之旅,自闭症学校全托为孩子打造温馨成长环境
原文指路:http://www.zibizhengwang.com/page33.html 在广州这座繁华都市的一隅,有一所特别的学校——星贝育园自闭症儿童寄宿制学校,它如同一座灯塔,照亮了自闭症儿童的学习与成长之路。在这里,每一个孩子都被视为独…...
多线程编程简单例题(3个线程) Linux环境 C语言实现
问题:编写程序完成如下功能:程序创建2个线程,然后: 1> 主线程先打印“I am main thread”,然后睡眠2秒后,打印"main thread wake up",主线程退出 2> 第一个新线程先打印“…...
UG NX12.0建模入门笔记:1.2 鼠标的基本操作
文章目录 前言:鼠标的操作1.鼠标左键:单击—>单选;长按并滑动—>框选。2.鼠标右键:在不同的地方单击弹出不同的菜单。3.鼠标中键:滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键:摁住鼠标中键&…...
NVME盘未格式化导致Ubuntu20.04启动慢
背景 最近公司一款产品转产,工厂组装好后,用我提供的系统镜像烧录,系统起来后发现Ubuntu20.04转圈了90秒才进入图形界面,这是不可接受的,公司老总要求当天必须解决。 定位 分析syslog 看不到系统启动时的日志&…...
VSCode创建插件HelloWorld找不到指令解决办法
按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后,ctrl shift P,输入helloworld并没有指令提示 原因:当前电脑安装的VSCode版本过低,不支持当前插件的使用(因为自动生成的插件总是默认使用最新版VSC…...
第20场 小白入门赛本场比赛为「蓝桥·算法双周赛」第二十场分级赛——小白入门赛
1. 四个亲戚【算法赛】 问题描述 风流倜傥的贾宝玉,拥有四个如花似玉的亲戚:林黛玉、薛宝钗、元春和迎春。这日,他们组团出国旅游了。为了方便称呼,宝玉给她们取了英文昵称,分别为:Daiyu、Baochai、Yuanchun 和Yingchun。但是&a…...
论文研读 | End-to-End Object Detection with Transformers
DETR:端到端目标检测的创新 —— 作者 Nicolas Carion 等人 一、背景与挑战 目标检测是计算机视觉领域的一个核心任务,要求模型精确识别图像中的物体类别和位置。传统方法如 Faster R-CNN,因其区域建议网络等复杂结构,使得模型调…...
构建高效在线教育平台:Spring Boot的力量
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理信息化在线教学平台的相关信息成为必然。开…...
C#Process进程的使用,以及对ProcessInfo中所有的参数详细记录
目录 一、Process 二、ProcessInfo 2.1 FileName 2.2 Arguments 2.3 WorkingDirectory 2.4 CreateNoWindow 2.5 UseShellExecute 2.6 RedirectStandardInput 2.7 RedirectStandardOutput 2.8 RedirectStandardError 2.9 WindowStyle 2.10 Verb 2.11 LoadUserProfil…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
