首页/新闻资讯/正文详情

Java解析不规范中国区域地址

发布时间:2026/11/11 9:14:56 来源:云帆数科 栏目:资讯中心
Java解析不规范中国区域地址
Java解析不规范中国区域地址本文用于解析将收集的中国行政区域地址转成规范标准行政区域,可支持解析一下各种复杂不规范的字符串, 目前只支持到省市区(县)三级江西省赣州市寻乌县江西省赣州市寻乌江西省赣州寻乌江西赣州寻乌县江西-赣州-寻乌县江西/赣州/寻乌江西省/赣州市/寻乌县…获取标准中国行政区域库博主数据库中已有标准数据, 故不介绍如何获取(可通过网洛来源获取)ListRecordareaListDb.find(Db.getSqlPara(com.dsfa.teas.lgydx.web.enroll.enrollunit.sql.unit.getArea));#sql(getArea)selectname,areacode,treeinfo_level,treeinfo_pid,aliasfromdsfa_areawheretreeinfo_levelin(2,3,4)andds_deleted0#end定义需要用的实体类RegionData public class Region { /** 国标编码 */ private String code; /** 标准全称 */ private String name; /** 别名列表从alias字符串切割 */ private ListString aliasList; /** 级别1省2市3区县 */ private Integer level; /** 父编码 */ private String parentCode; }AreaDTOData public class AreaDTO { private String provinceCode; private String province; private String cityCode; private String city; private String countyCode; private String county; /** * 获取拼接全称路径格式 xx/xx/xx缺后面层级自动截断 * return 如 江西省/赣州市/寻乌县或 江西省/赣州市或 江西省 */ public String getFullPath() { ListString parts new ArrayList(); if (StrKit.isNotBlank(province)) { parts.add(province); } if (StrKit.isNotBlank(city)) { parts.add(city); } if (StrKit.isNotBlank(county)) { parts.add(county); } return String.join(/, parts); } }将标准地址库解析成Region存入内存中, 方便后续取用这里定义了可能存在的区域后缀, 或许还存在没考虑到的, 后缀越全面后续分词匹配越精准, 如遇到无法解析的地址可以进行维护后缀// 内存缓存 privateListRegionprovinceList;privateListRegioncityList;privateListRegioncountyList;publicvoidloadRegionCache(){ListRecordareaListDb.find(Db.getSqlPara(com.dsfa.teas.lgydx.web.enroll.enrollunit.sql.unit.getArea));ListRegionallRegionnewLinkedList();ListStringsuffixesArrays.asList(newString[]{特别行政区,自治州,自治县,自治区,林区,地区,盟,省,市,县,区,旗,乡,镇});// 切割别名字符串为Listfor(Recordr:areaList){RegionregionnewRegion();region.setName(r.getStr(name));region.setCode(r.getStr(areacode));region.setLevel(Integer.parseInt(r.getStr(treeinfo_level)));region.setParentCode(r.getStr(treeinfo_pid));if(StrKit.isNotBlank(r.getStr(alias))){ListStringaliasArrays.stream(r.getStr(alias).split(,)).map(String::trim).filter(StrKit::isNotBlank).collect(Collectors.toList());// 正式名称去掉后缀 模拟不规范的写法ListStringaddsuffixes.stream().filter(suffix-r.getStr(name).endsWith(suffix)).map(suffix-r.getStr(name).replace(suffix,)).collect(Collectors.toList());alias.addAll(add);region.setAliasList(alias);}else{region.setAliasList(Collections.singletonList(r.getStr(name)));}// 关键对别名按名称长度降序排序, 防止短词提前匹配region.getAliasList().sort(Comparator.comparingInt(String::length).reversed());allRegion.add(region);}// 按级别分组provinceListallRegion.stream().filter(r-r.getLevel()2).collect(Collectors.toList());cityListallRegion.stream().filter(r-r.getLevel()3).collect(Collectors.toList());countyListallRegion.stream().filter(r-r.getLevel()4).collect(Collectors.toList());// 关键按名称长度降序排序长名称优先匹配防止短词提前匹配provinceList.sort((o1,o2)-Integer.compare(o2.getName().length(),o1.getName().length()));cityList.sort((o1,o2)-Integer.compare(o2.getName().length(),o1.getName().length()));countyList.sort((o1,o2)-Integer.compare(o2.getName().length(),o1.getName().length()));System.out.println( 行政区划缓存加载完成 );System.out.printf(省%d 条市%d 条区县%d 条%n,provinceList.size(),cityList.size(),countyList.size());}使用ApplicationRunner, 让项目启动时就预先加载好标准区域库ComponentpublicclassRegionCacheLoaderimplementsApplicationRunner,PriorityOrdered{ResourceprivateRegionParseCacheUtilregionParseCacheUtil;Overridepublicvoidrun(ApplicationArgumentsargs)throwsException{// 这里执行加载区划缓存regionParseCacheUtil.loadRegionCache();}OverridepublicintgetOrder(){returnInteger.MAX_VALUE;}}地址解析入口方法/** * 地址解析入口 * param rawAddr 原始地址 支持江西省赣州市寻乌县 / 江西赣州寻乌 / 江西/赣州/寻乌 * return AreaDTO */publicAreaDTOparse(StringrawAddr){if(StrKit.isBlank(rawAddr)){returnnull;}AreaDTOdtonewAreaDTO();// 预处理移除 / 和所有空白字符StringremainrawAddr.replace(/,).replace(/,).replaceAll(\\s,);// 匹配省for(Regionp:provinceList){for(Stringalias:p.getAliasList()){if(remain.startsWith(alias)){dto.setProvince(p.getName());dto.setProvinceCode(p.getCode());remainremain.substring(alias.length());break;}}if(dto.getProvince()!null)break;}// 匹配市只有匹配到省之后才继续if(dto.getProvince()!null){// 只在本省内的市做匹配ListRegiontempCityListcityList.stream().filter(city-dto.getProvinceCode().equals(city.getParentCode())).collect(Collectors.toList());for(Regionc:tempCityList){for(Stringalias:c.getAliasList()){if(remain.startsWith(alias)){dto.setCity(c.getName());dto.setCityCode(c.getCode());remainremain.substring(alias.length());break;}}if(dto.getCity()!null)break;}}// 匹配区县匹配到市后继续if(dto.getCity()!null){// 只在本市内的区县做匹配ListRegiontempCountryListcountyList.stream().filter(county-dto.getCityCode().equals(county.getParentCode())).collect(Collectors.toList());for(Regionco:tempCountryList){for(Stringalias:co.getAliasList()){if(remain.startsWith(alias)){dto.setCounty(co.getName());dto.setCountyCode(co.getCode());break;}}if(dto.getCounty()!null)break;}}returndto;}使用实例AreaDTOparseregionParseCacheUtil.parse(area);StringfullPathparse.getFullPath();System.out.println(解析后的标准行政区域 fullPath);AreaDTO 存有省市区-区域编码code, 有需要可以使用

相关推荐

InvenTree 开源库存管理系统:如何用 Docker 三步跑起来
InvenTree 开源库存管理系统:如何用 Docker 三步跑起来

InvenTree 开源库存管理系统:如何用 Docker 三步跑起来 【免费下载链接】InvenTree Open Source Inventory Management System 项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree InvenTree 是一个用 Python/Django 构建的开源库存管理系统&#… · 2026/11/11 9:14:56

notepad-- 文本编辑器 macOS 安装教程:3 条路线,最快 5 分钟跑通
notepad-- 文本编辑器 macOS 安装教程:3 条路线,最快 5 分钟跑通

notepad-- 文本编辑器 macOS 安装教程:3 条路线,最快 5 分钟跑通 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/n… · 2026/11/10 7:13:01

Springboot 集成 Sharding-JDBC+Mybatis实现读写分离
Springboot 集成 Sharding-JDBC+Mybatis实现读写分离

一、前言 Sharding-jdbc是开源的数据库操作中间件;定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全… · 2026/11/9 1:57:41

宁夏吴忠高压电工证多少钱?证书过期了不知道怎么复审延期怎么办
宁夏吴忠高压电工证多少钱?证书过期了不知道怎么复审延期怎么办

宁夏吴忠高压电工证多少钱?证书过期了不知道怎么复审延期怎么办 证书过期了不知道怎么复审延期,这事儿真的挺闹心。特别是像宁夏吴忠的高压电工证,一旦错过复审时间,轻则影响工作,重则可能面临被单位辞退、收入断崖式下降。很多人以为这个证办了就完事了… · 2026/11/11 9:14:32

学校用哪种电工证最好?值不值得考?工地太忙根本没时间复习考试
学校用哪种电工证最好?值不值得考?工地太忙根本没时间复习考试

学校用哪种电工证最好?值不值得考?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这几乎是每个电工从业者的真实写照。尤其是那些在施工一线、教学岗位或学校后勤部门工作的电工人员,他们不仅要应对繁重的工作任务,还要面对特种作业操作证考试… · 2026/11/11 9:14:32

特种作业操作证不符?学历不高怕报不上名?保姆级教程帮你搞定
特种作业操作证不符?学历不高怕报不上名?保姆级教程帮你搞定

特种作业操作证不符?学历不高怕报不上名?保姆级教程帮你搞定 你是不是也担心自己学历不高,考不了特种作业操作证?别急,今天咱们就来聊聊这个【特种作业操作证不符】的常见问题,告诉你怎么一步步解决,还能教你从零开始报班、备考、考试、拿证、复审的全… · 2026/11/11 9:14:32

电工证 查询别搞错了!全国通用的证书过期了怎么续?
电工证 查询别搞错了!全国通用的证书过期了怎么续?

电工证 查询别搞错了!全国通用的证书过期了怎么续? 你是不是也遇到过这种情况: 电工证过期了,却不知道怎么复审延期? 别急,这种情况每年都有很多电工朋友遇到,特别是像你这样刚毕业的应届生,可能还不太清楚怎么操作。别担心,下面我用最直白的方式… · 2026/11/11 9:14:32

特种作业操作证不符怎么处理?官方报名入口在这儿
特种作业操作证不符怎么处理?官方报名入口在这儿

特种作业操作证不符怎么处理?官方报名入口在这儿 怕考不过白交培训费?特种作业操作证不符,不是小问题,直接关系到你能不能上岗,能不能顺利承接项目。特别是像济源劳务班组的负责人,手里几十号人,一个证不对,可能就耽误一整个工程进度。今天咱们就来聊… · 2026/11/11 9:14:32

绍兴电工证如何办理 电子证书怎么领 低学历也能考
绍兴电工证如何办理 电子证书怎么领 低学历也能考

绍兴电工证如何办理 电子证书怎么领 低学历也能考 你是不是也担心学历不高报不了名?别急,绍兴电工证如何办理其实一点都不难,尤其是现在有 电子证书… · 2026/11/11 9:13:29

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43

_中职电工证最新政策解读
_中职电工证最新政策解读

中职电工证在哪考?工地太忙根本没时间复习考试的救星来了 工地太忙根本没时间复习考试,这是很多正在备考 中职电工证 的建筑工友的真实写照。你不是不想考,而是真的没时间。但别担心,这期内容是 新乡初次报考人员… · 2026/11/11 0:00:52

昆明电工证培训价格值不值得考?老电工告诉你真相
昆明电工证培训价格值不值得考?老电工告诉你真相

昆明电工证培训价格值不值得考?老电工告诉你真相 之前考的证在外省能不能转过来?这个问题是很多在外地打工、换城市生活、或者是想在昆明发展的朋友最关心的。尤其是现在云南发展快,很多企业都在招持证上岗的电工,如果你手头有证但不在本地,那这个证是不… · 2026/11/11 0:00:52

特种电缆张工网上查询全攻略:外省证如何转过来
特种电缆张工网上查询全攻略:外省证如何转过来

特种电缆张工网上查询全攻略:外省证如何转过来 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题,尤其是像特种电缆张工这类证书,直接关系到日常工作是否合规、能否顺利晋升。很多小伙伴因为证书归属地的问题,陷入职业发展的瓶颈,甚至… · 2026/11/11 0:00:52

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码