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…...
DevOps 实践与自动化运维:从手动到智能
DevOps 实践与自动化运维:从手动到智能 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知 DevOps 在现代软件开发中的重要性。DevOps 不仅能缩短开发周期,提高软件质量,还能增强系统的可靠性和可维护性。今天,…...
教育资源数字化转型:tchMaterial-parser电子课本获取工具深度解析
教育资源数字化转型:tchMaterial-parser电子课本获取工具深度解析 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。…...
csp信奥赛c++之字符数组与字符串的区别
csp信奥赛c之字符数组与字符串的区别 一、字符数组与字符串的区别(详细讲解) 在C(尤其信奥赛CSP常用环境)中,“字符数组”和“字符串”通常指两种不同的数据类型或存储方式: 特性字符数组 (char[])字符串…...
(87页PPT)6大领域+50个战略框架模型(附下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/92683878 资料解读:6 大领域 50 个战略框架模型 详细资料请看本解读文章的最后内容 在商业竞争日趋激烈的当下,系统…...
AI绘画新体验:灵毓秀-牧神-造相Z-Turbo快速入门,小白也能画古风女神
AI绘画新体验:灵毓秀-牧神-造相Z-Turbo快速入门,小白也能画古风女神 1. 认识灵毓秀-牧神-造相Z-Turbo 1.1 什么是灵毓秀-牧神-造相Z-Turbo 灵毓秀-牧神-造相Z-Turbo是一款专门用于生成《牧神记》中灵毓秀角色图像的AI绘画模型。它基于Xinference框架部…...
Wan2.1 VAE数据预处理实战:Python爬虫采集的训练数据清洗
Wan2.1 VAE数据预处理实战:Python爬虫采集的训练数据清洗 如果你对Wan2.1 VAE模型感兴趣,想用自己的图片集来训练它,那么你很可能已经遇到了第一个,也是最关键的一个难题:数据从哪里来?又该怎么处理&#…...
零代码体验LingBot-Depth:在线Demo快速生成3D深度效果图
零代码体验LingBot-Depth:在线Demo快速生成3D深度效果图 1. 引言:当普通照片“看”懂了三维世界 你有没有想过,一张普通的手机照片,除了记录下那一刻的色彩和构图,还能“记住”当时场景里每个物体离你有多远…...
百度网盘直链解析:告别龟速下载的Python利器
百度网盘直链解析:告别龟速下载的Python利器 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾面对百度网盘几十KB的下载速度感到无奈?当别人都在…...
OpenClaw代码助手:Qwen3-14b_int4_awq实现的自动补全与错误检查
OpenClaw代码助手:Qwen3-14b_int4_awq实现的自动补全与错误检查 1. 为什么需要本地化代码助手? 作为一名长期与代码打交道的开发者,我一直在寻找能够提升编程效率的工具。传统的IDE插件虽然能提供基础补全,但存在几个痛点&#…...
千问3.5-2B环保监测辅助:水质检测仪读数识别、污染源现场图描述与报告生成
千问3.5-2B环保监测辅助:水质检测仪读数识别、污染源现场图描述与报告生成 1. 环保监测中的AI视觉助手 环保监测工作常常面临两大挑战:现场数据采集的准确性和后期报告生成的效率。传统方式需要工作人员手动记录仪器读数、拍摄现场照片后返回办公室整理…...
