当前位置: 首页 > news >正文

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

一、企业内部网络架构 在一个中型企业中&#xff0c;通常会有以下的网络架构&#xff1a; - 核心层&#xff1a;由高性能的核心交换机组成&#xff0c;负责快速转发大量数据。例如采用具有高带宽和冗余功能的三层交换机&#xff0c;确保整个网络的稳定运行。它连接着各个部门的…...

无人机之室内定位技术篇

无人机的室内定位技术是实现无人机在室内环境中精准导航和定位的关键技术。由于室内环境复杂&#xff0c;卫星导航系统&#xff08;如GPS&#xff09;无法提供有效的信号&#xff0c;因此需要依赖其他室内定位技术。 一、主要技术类型 基于视觉的定位技术 原理&#xff1a;利…...

在ubuntu20.04中输入不存在shell命令时,报错ModuleNotFoundError的解决方案

这个问题出现过好几次&#xff0c;每次都比较困扰&#xff0c;以下的解决方案比较适合&#xff1a; 当我输入ubuntu无法识别的命令的时候&#xff0c;正常来说应该提示类似于 command not found 之类的字眼&#xff0c;但是系统确报了如下错误&#xff1a; Traceback (most r…...

互联网语言 互联网开发 互联网架构

JAVA和PHP是两种广泛应用于互联网开发的编程语言&#xff0c;它们在多个维度上展现出显著的不同。 JAVA是一种面向对象的编程语言&#xff0c;以其严谨、高效的特性而著称。JAVA的语法结构复杂且规范&#xff0c;强调封装、继承和多态等面向对象原则&#xff0c;适合构建大型企…...

解决MybatisPlus updateById更新数据时将没传的数据也更新成了null

首先&#xff0c;MybatisPlus在调用自带的更新接口updateById时&#xff0c;如果没加任何配置&#xff0c;默认是不会将前端没传的数据也更新成null的。即MyBatisPlus不会更新传入实体中为null的字段&#xff0c;只会更新设置了不为null的值。 如果发现没传的也更新成null了的话…...

OpenWRT 和 Padavan 路由器配置网络打印机 实现远程打印

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 之前有给大家介绍过 Armbian 安装 CUPS 作为打印服务器&#xff0c;像是 N1 盒子、玩客云&#xff0c;甚至是随身 WiFi 都可以通过 CUPS 来进行打印。但是有些朋友不想专门为打印机添置一个设备&#xff0…...

R语言机器学习教程大纲

文章目录 介绍机器学习算法监督学习Supervised Learning分类Classification回归Regression 无监督学习 Unsupervised Learning聚类 Clustering降纬 Dimensionality Reduction相关Association 强化学习Reinforcement Learning模型自由 Model-Free Methods模型驱动 Model-Based M…...

java如何部署web后端服务

java如何部署web后端服务 简单记录一下&#xff0c;方便后续使用。 部署流程 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用于属性绑定&#xff0c;使得属性可以动态修改 v-bind动态修改class 动态修改的class名来源于data对象&#xff0c;而非手动给定 基础示例 <style>div{width: 100px;height: 100px;border: 3px solid #000;}.bg {background: red;}</sty…...

基于STM32的智能电能表设计

引言 本项目设计了一个基于STM32的智能电能表系统&#xff0c;能够实时测量家用电器的电压、电流、功率和电能消耗。该系统集成了电压电流传感器、显示屏、通信模块等&#xff0c;能够实现电能测量、数据显示、数据存储和远程传输功能&#xff0c;适用于家庭、工业等场景的电能…...

开启学习与探索之旅,自闭症学校全托为孩子打造温馨成长环境

原文指路&#xff1a;http://www.zibizhengwang.com/page33.html 在广州这座繁华都市的一隅&#xff0c;有一所特别的学校——星贝育园自闭症儿童寄宿制学校&#xff0c;它如同一座灯塔&#xff0c;照亮了自闭症儿童的学习与成长之路。在这里&#xff0c;每一个孩子都被视为独…...

多线程编程简单例题(3个线程) Linux环境 C语言实现

问题&#xff1a;编写程序完成如下功能&#xff1a;程序创建2个线程&#xff0c;然后&#xff1a; 1> 主线程先打印“I am main thread”&#xff0c;然后睡眠2秒后&#xff0c;打印"main thread wake up",主线程退出 2> 第一个新线程先打印“…...

UG NX12.0建模入门笔记:1.2 鼠标的基本操作

文章目录 前言&#xff1a;鼠标的操作1.鼠标左键&#xff1a;单击—>单选&#xff1b;长按并滑动—>框选。2.鼠标右键&#xff1a;在不同的地方单击弹出不同的菜单。3.鼠标中键&#xff1a;滚动中键—>放大缩小【镜头拉近拉远】。4.鼠标中键&#xff1a;摁住鼠标中键&…...

NVME盘未格式化导致Ubuntu20.04启动慢

背景 最近公司一款产品转产&#xff0c;工厂组装好后&#xff0c;用我提供的系统镜像烧录&#xff0c;系统起来后发现Ubuntu20.04转圈了90秒才进入图形界面&#xff0c;这是不可接受的&#xff0c;公司老总要求当天必须解决。 定位 分析syslog 看不到系统启动时的日志&…...

VSCode创建插件HelloWorld找不到指令解决办法

按照网上的教程执行yo code并且生成成功 但是F5打开调试新窗口后&#xff0c;ctrl shift P&#xff0c;输入helloworld并没有指令提示 原因&#xff1a;当前电脑安装的VSCode版本过低&#xff0c;不支持当前插件的使用&#xff08;因为自动生成的插件总是默认使用最新版VSC…...

第20场 小白入门赛本场比赛为「蓝桥·算法双周赛」第二十场分级赛——小白入门赛

1. 四个亲戚【算法赛】 问题描述 风流倜傥的贾宝玉&#xff0c;拥有四个如花似玉的亲戚:林黛玉、薛宝钗、元春和迎春。这日&#xff0c;他们组团出国旅游了。为了方便称呼&#xff0c;宝玉给她们取了英文昵称&#xff0c;分别为:Daiyu、Baochai、Yuanchun 和Yingchun。但是&a…...

论文研读 | End-to-End Object Detection with Transformers

DETR&#xff1a;端到端目标检测的创新 —— 作者 Nicolas Carion 等人 一、背景与挑战 目标检测是计算机视觉领域的一个核心任务&#xff0c;要求模型精确识别图像中的物体类别和位置。传统方法如 Faster R-CNN&#xff0c;因其区域建议网络等复杂结构&#xff0c;使得模型调…...

构建高效在线教育平台:Spring Boot的力量

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理信息化在线教学平台的相关信息成为必然。开…...

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…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...