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…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
