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…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
