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

正则表达式,匹配全国五级地址工具类,可以直接放在项目中使用~
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 {
        // 初始化pattern
        pattern = 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
    @ToString
    public static class Region{
        /**
         * 一级地址:中国
         */
        private String nation;
        /**
         * 二级地址:省、
         */
        private String province;
        /**
         * 三级地址值:区市县
         */
        private String city;
        /**
         * 四级地址:镇等
         */
        private String area;
        /**
         * 五级地址:街道等
         */
        private String street;
        /**
         * 后续地址详情
         */
        private String detail;
    }

    @Getter
    @Setter
    @ToString
    public static class LevelRegion{
        /**
         * 一级地址:中国
         */
        private String firstRegion;
        /**
         * 二级地址:省、
         */
        private String secondRegion;
        /**
         * 三级地址值:区市县
         */
        private String thirdRegion;
        /**
         * 四级地址:镇等
         */
        private String fourthRegion;
        /**
         * 五级地址:街道等
         */
        private String fifthRegion;
        /**
         * 后续地址详情
         */
        private String detail;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值