【Java 解析全国地址】Java 利用正则表达式完美解析全国省市区地址

编程之家收集整理的这篇文章主要介绍了【Java 解析全国地址】Java 利用正则表达式完美解析全国省市区地址编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

Java 利用正则表达式完美解析全国省市区地址一、问题场景描述最近在项目中遇到了一个全国地址解析的一个场景,前端会传来一个字符串,后端需自动解析出 xx省xx市xx区+详细地址 的这种格式。因为我们的数据来源于其他系统,客户地址在其他系统可能是随便填的,并不是正确的,所以前端也做了支持更改地址的操作。所以,我们的地址解析方式也是根据前端的地址格式来进行解析的。二、解决方案我也是第一次遇到这个场景,于是首先百度了一手,得到的解决方案有:根据正则表达式进行解析;https://blog.csd

Java 利用正则表达式完美解析全国省市区地址

一、问题场景描述

最近在项目中遇到了一个全国地址解析一个场景,前端会传来一个字符串,后端需自动解析xx省xx市xx区+详细地址 的这种格式

因为我们的数据来源于其他系统,客户地址在其他系统可能是随便填的,并不是正确的,所以前端也做了支持更改地址的操作。所以,我们地址解析方式也是根据前端的地址格式进行解析的。

二、解决方

我也是第一次遇到这个场景,于是首先百度了一手,得到的解决方案有:

  1. 根据正则表达式进行解析
    1. https://blog.csdn.net/superSubfn/article/details/80290491
    2. https://blog.csdn.net/weixin_44590872/article/details/108470804
  2. 字符串匹配遍历的方式;
    1. https://juejin.cn/post/6969820144927244324
    2. https://blog.csdn.net/renfng/article/details/94738164

tips: 还有其他的解决方案,已经找不到网址了,就不贴了

根据我们这个业务需求,用正则是比较方便的,因为我们前端会有地址的固定格式,比如:江苏省南京市雨花台区某某地址,对于这段字符串,只要成功匹配出省、市、区就可以完成地址解析

三、开发过程中遇到的问题

我一开始是直接用了百度的正则,这个正则表达式,可以解析出正常的省市区地址,但是对于北京市这种直辖市和香港行政区这些地方没有做很好的匹配。于是,根据前端的地址选项做出了正则的更改。

前端的地址选项格式

在这里插入图片描述

前端对于北京上海这类直辖市,的格式:北京市北京市西城区xx地址

// 百度到的正则
String regex="(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
// 修改后的正则
String regex = "(?<province>[^省]+省|.+自治区|[^澳门]+澳门|[^香港]+香港|[^市]+市)?(?<city>[^自治州]+自治州|[^特别行政区]+特别行政区|[^市]+市|.*?地区|.*?行政单位|.+盟|市辖区|[^县]+县)(?<county>[^县]+县|[^市]+市|[^镇]+镇|[^区]+区|[^乡]+乡|.+场|.+旗|.+海域|.+岛)?(?<address>.*)";

四、应用代码

1、地址封装类

@Data
@NoArgsConstructor
public class WSSsdrAddress implements Serializable {
		
    private String province;

    private String city;

    private String county;

    private String address;

    public WSSsdrAddress(String province, String city, String county, String address) {
        if (StringUtils.isBlank(province) ||
                StringUtils.isBlank(city) ||
                StringUtils.isBlank(county) ||
                StringUtils.isBlank(address)) {
            throw new BaseException("客户联系地址出错");
        }
        this.province = province;
        this.city = city;
        this.county = county;
        this.address = address;
    }
}

2、地址解析工具类

public class AddressUtil {

    private AddressUtil() {}

    /**
     * 从地址串中解析提取出省市区等信息
     * @param address   地址信息
     * @return          解析后的地址Map
     */
    private static Map<String,String> addressResolution(String address){
        //1.地址的正则表达式
		String regex = "(?<province>[^省]+省|.+自治区|[^澳门]+澳门|[^香港]+香港|[^市]+市)?(?<city>[^自治州]+自治州|[^特别行政区]+特别行政区|[^市]+市|.*?地区|.*?行政单位|.+盟|市辖区|[^县]+县)(?<county>[^县]+县|[^市]+市|[^镇]+镇|[^区]+区|[^乡]+乡|.+场|.+旗|.+海域|.+岛)?(?<address>.*)";
        //2、创建匹配规则
        Matcher m = Pattern.compile(regex).matcher(address);
        String province;
        String city;
        String county;
        String detailAddress;
        Map<String,String> map = new HashMap<>(16);

        while (m.find()){
            //加入省
            province = m.group("province");
            map.put("province", province == null ? "" : province.trim());
            //加入市
            city = m.group("city");
            map.put("city", city == null ? "" : city.trim());
            //加入区
            county = m.group("county");
            map.put("county", county == null ? "" : county.trim());
            //详细地址
            detailAddress = m.group("address");
            map.put("address", detailAddress == null ? "" : detailAddress.trim());
        }
        return map;
    }

    /**
     * 根据地址获取解析后的地址对象
     * @param address   解析地址Str
     * @return          解析地址对象
     */
    public static WSSsdrAddress resolveAddress(String address) {
        if (CharSequenceUtil.isBlank(address)) {
            throw new BaseException("客户联系地址出错");
        }
        Map<String, String> addressMap = addressResolution(address);
        return new WSSsdrAddress(addressMap.get("province"), addressMap.get("city"), addressMap.get("county"), addressMap.get("address"));
    }

}

3、测试结果

下面的测试应该包含了全国90%以上稀奇古怪的区域名了:

在这里插入图片描述

五、附件

我们的项目是搭配着前端提供的省市区进行解析的,在此附上前端使用的全国省市区Json:https://github.com/getActivity/ProvinceJson/blob/master/province.json

如果帮助到了你,或者觉得有用,不妨点个赞?

参考文章

  1. https://blog.csdn.net/superSubfn/article/details/80290491
  2. https://blog.csdn.net/weixin_44590872/article/details/108470804

总结

以上是编程之家为你收集整理的【Java 解析全国地址】Java 利用正则表达式完美解析全国省市区地址全部内容,希望文章能够帮你解决【Java 解析全国地址】Java 利用正则表达式完美解析全国省市区地址所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

正则表达式文章

本示例基于Vue.js和mint UI实现。目录一、数据库的创建二、后端接口与数据库的连接三、前端代码实现1.注册页相关代码2.注册页效果3.登录页相关代码4.登录页效果四、注册登录演示一、数据库的创建此处以Navicat软件进行创建,新建数据库reg_log.sql与数据表reg_log; 为了实现注册业务,我们在数据库中设计ID、用户名、密码、邮箱、电话号5个字段。创建结束后保存,便可...
java中包含两种切分字符串方式:如下方法一:通过substring()截取字符串1. 只传入一个参数 substring(int beginIndex)传一个参数,含义为将字符串从索引号为beginIndex开始截取,一直到字符串末尾。注意第一个字符的索引值为零,截取时包含索引beginIndex的字符;示例代码如下: String oldStr = "zifu截取练习ing"; String str = oldStr.substring(5); System.out.printl
1.将编译程序分成若干个“遍”是为了(B )A.提高程序的执行效率B.使程序的结构更加清晰C.利用有限的机器内存并提高机器的执行效率D.利用有限的机器内存但降低了机器的执行效率2.构造编译程序应掌握(D )A.源程序 B.目标语言 C.编译方法 D.以上三项都是3.变量应当(C )A.持有左值 B.持有右值C.既持有左值又持有右值 ...
正则表达式,可能大家都听说过,但是我们平时在项目中写的可能是比较少的。 但是却又是不可缺少的。在做base64上传的时候,我们需要找到这个变成base64后的图片类型。
``` 替换 &amp;开头。;结尾之间的内容。用空格代替他们 var regExp = /&amp;.*?;/g; var str = &#39;123&amp;asdsa;dqwe&#39;;
```在web网页中,所有的项目中。input表单中不能让用户输入script这些敏感性的。一旦出现提示用户非正常输入。然后立刻将值清空`````` ``````methods: { blurHand
正则详细教程系列可以看此链接的文章哦 https://www.cnblogs.com/poloyy/category/1796055.html 前言 正则表达式应该在很多地方都见过,编程,工具 可以说
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注