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

匹配全国地址的正则表达式工具类

正则表达式,匹配全国五级地址工具类,可以直接放在项目中使用~
1级:国 (可忽略不填)
2级:**省、**自治区、**直辖市、**特别行政区、(四个直辖市可忽略不填)
3级:**市、**地区、**自治州、**盟、**自治区、**县、**自治县、
4级:**区、**市、**县、**乡、**民族乡、**镇、**自治县、
5级:**县、**街道、**镇、**团、**岸、**场、**处、**委员会、**区、市、乡、
+详情地址(如:小区
单元
室)

拿到手就可以直接使用啦
如下是运行结果:
在这里插入图片描述


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/**1级:国 (可忽略不填)2级:**省、**自治区、**直辖市、**特别行政区、(四个直辖市可忽略不填)3级:**市、**地区、**自治州、**盟、**自治区、**县、**自治县、4级:**区、**市、**县、**乡、**民族乡、**镇、**自治县、5级:**县、**街道、**镇、**团、**岸、**场、**处、**委员会、**区、**市、**乡、+详情地址(如:**路**小区**单元**室)** @date 2024-10-12 17:30:00* @author wangzhen*/
public class RegionCalcUtil {// 匹配国家: 中国 一级地址private static final String nation = "中国";// 正则表达式: 匹配城市 二级地址private static final String provinceRegex = "(?<province>[^省]+省|[^自治区]+自治区|[^特别行政区]+特别行政区|[^直辖市]+直辖市|北京|上海|天津|重庆)";// 正则表达式: 匹配区市县 三级地址private static final String cityRegex = "(?<city>[^市]+市|[^地区]+地区|[^自治州]+自治州|[^盟]+盟|[^自治区]+自治区|[^县]+县)";// 正则表达式: 匹配街道镇等 四级地址private static final String areaRegex = "(?<area>[^县]+县|[^区]+区|[^市]+市|[^乡]+乡|[^镇]+镇)";// 正则表达式: 匹配街道镇团等 五级地址private static final String streetRegex = "(?<street>[^县]+县|[^街道]+街道|[^镇]+镇|[^团]+团|[^岸]+岸|[^场]+场|[^处]+处|[^委员会]+委员会|[^区]+区|[^市]+市|[^乡]+乡)";// 正则表达式: 匹配国家private static final String detailAddress = "(?<detail>.*)";// 各级地址分隔符,如想在各级地址中间带上 - ,就设置为该值private static final String separate = "";// 该属性是线程安全的private static final Pattern pattern;static {// 初始化patternpattern = Pattern.compile(provinceRegex + separate +cityRegex + separate +areaRegex + separate +streetRegex + separate +detailAddress);}public static void main(String[] args) {
//        山东省-威海市-威海火炬高技术产业开发区-怡园街道威海高区文鑫家园2号楼001室
//        上海市-长宁区-程家桥街道虹桥路2279号温莎花园00幢
//        浙江省-金华市-义乌市-廿三里街道街道龙潭路1号33楼
//        山东省-菏泽市-牡丹区-东城街道青年南路569韵泽园小区1号楼一单元
//        江西省-南昌市-南昌县-东新乡象湖新城金沙大道绿地山庄188栋String address = "重庆 重庆市 合川区 钓鱼城街道盘龙路环球家园1栋一单元4_3;";System.out.println(addressResolution(address));}public static Region addressResolution(String address) {address = prevProcess(address);// 编译正则表达式,注意这里的顺序可能需要调整以避免冲突Matcher matcher = pattern.matcher(address);if (matcher.find()) {// 用于有序存放四级地址Region region = new Region();region.setNation(nation);region.setProvince(removeStr(matcher.group("province")));region.setCity(removeStr(matcher.group("city")));region.setArea(removeStr(matcher.group("area")));region.setStreet(removeStr(matcher.group("street")));region.setDetail(removeStr(matcher.group("detail")));return region;}return null;}public static LevelRegion addressResolutionToLevel(String address){Region region = addressResolution(address);if(region == null){return null;}LevelRegion levelRegion = new LevelRegion();levelRegion.setFirstRegion(region.getNation());levelRegion.setSecondRegion(region.getProvince());levelRegion.setThirdRegion(region.getCity());levelRegion.setFourthRegion(region.getArea());levelRegion.setFifthRegion(region.getStreet());levelRegion.setDetail(region.getDetail());return levelRegion;}private static String removeStr(String str){if(str == null){return null;}return str.trim().replaceAll("-", "").replaceAll(",", "").replaceAll("\\.", "").replace(" ", "");}private static String prevProcess(String address){// 不填四个直辖市,给补充上if(address.startsWith("上海市")){address = "上海" + address;}else if(address.startsWith("北京市")){address = "北京" + address;}else if(address.startsWith("天津市")){address = "天津" + address;}else if(address.startsWith("重庆市")){address = "重庆" + address;}// 将国家去掉if(address.startsWith(nation)){address = address.substring(nation.length());}return address;}@Getter@Setter@ToStringpublic static class Region{/*** 一级地址:中国*/private String nation;/*** 二级地址:省、*/private String province;/*** 三级地址值:区市县*/private String city;/*** 四级地址:镇等*/private String area;/*** 五级地址:街道等*/private String street;/*** 后续地址详情*/private String detail;}@Getter@Setter@ToStringpublic static class LevelRegion{/*** 一级地址:中国*/private String firstRegion;/*** 二级地址:省、*/private String secondRegion;/*** 三级地址值:区市县*/private String thirdRegion;/*** 四级地址:镇等*/private String fourthRegion;/*** 五级地址:街道等*/private String fifthRegion;/*** 后续地址详情*/private String detail;}
}
http://www.lryc.cn/news/461202.html

相关文章:

  • Notepad++ 使用技巧
  • 《语音识别芯片选型全攻略》
  • 【MySQL】VARCHAR和CHAR的区别?
  • SQL Server日期查询常用语句
  • java地理方位角度计算
  • RabbitMQ service is already present - only updating service parameters
  • 贵州网站建设提升可见性的策略
  • SUGAR:用于皮层表面配准的球形超快图注意力框架|文献速递-基于深度学习的医学影像分类,分割与多模态应用
  • 华为高频手撕冲刺
  • 如何优雅的通过Spring Boot+Redission对订单实现定时关闭
  • 二、IPD 的定义与背景
  • STM32CubeMX初始生成工程
  • STM32单片机(F03C8T6)-点灯(寄存器点灯和库函数点灯)
  • PCL 3D-SIFT关键点检测(曲率不变特征约束
  • Android上的AES加密
  • 安全测试的漏洞类型
  • 51 | 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?
  • ORM框架简介
  • Windows系统上根据端口号查找对应进程
  • 一文通透OpenAI o1:从CoT、Quiet-STaR、Self-Correct、Self-play RL、MCST等技术细节到工程复现
  • 如何解决与kernel32.dll相关的常见错误:详细指南解析kernel32.dll文件缺失、损坏或错误加载问题
  • Caffeine Cache解析(一):接口设计与TinyLFU
  • 深入探索LINUX中AWK命令:强大的文本处理工具
  • 数字化转型:解决项目管理困境的新路径
  • Arthas常用的命令(三)--monitor、jad 、stack
  • Power BI之常用DAX函数使用介绍——提供数据源练习
  • SQL-触发器(trigger)的详解以及代码演示
  • 【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台
  • Linux系统编程——进程标识、进程创建
  • 【超级福利】openMind开源实习来袭,奖励高达万元,解锁你的AI实践新篇章!