尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

实测:45 条脏地址,用 address-parse 做 Java 收货地址解析要写几行代码?

实测:45 条脏地址,用 address-parse 做 Java 收货地址解析要写几行代码? 实测45 条脏地址用 address-parse 做 Java 收货地址解析要写几行代码【免费下载链接】address-parseJava 版智能解析收货地址项目地址: https://gitcode.com/gh_mirrors/addr/address-parse凌晨一点我盯着屏幕上那批导出的订单数据发呆。同一个字段里收货人: 杨燕艳和所在地区: 广东省深圳市龙岗区挤在一起手机号一会儿是131 1111 1111一会儿是86-13311111111还有人把电話写成了繁体。手写正则改了第七版总有几个样例跑偏同事补刀要不接个第三方 API——然后被预算两个字噎了回去。这就是大多数做电商、物流、外卖系统的后端工程师都撞过的墙收货地址解析。今天我想跟你分享的是一个叫address-parse的 Java 智能地址解析库。它把姓名、手机号、省市区、详细地址从混乱字符串里一次性拆干净本地运行、毫秒级返回、完全免费。下面我用它跑一遍真实脏数据你看看效果。先看数据底座address-parse 凭什么认识全国省市区动手之前先弄明白它为什么认识地址。address-parse 的核心是一份内置的行政区划数据china-area.json覆盖了 34 个省级行政区、333 个地级市和 2844 个县级区域。每个节点的结构长这样{ areaCode: 110101000000, cityCode: 010, level: 2, name: 东城区, parentCode: 110100000000, shortName: 东城, zipCode: 100000 }关键信息有四个level表示层级0 省、1 市、2 区县正好对应源码里的 AreaEnum.javaparentCode通过 TreeUtils.java 把扁平 JSON 拼成树省-市-区县的关系一目了然shortName是简称用来匹配深圳这种省略写法zipCode顺带把邮编也带出来了。库启动时会把这棵树加载进内存从日志能看到初始化耗时——这为后面的预热埋了个伏笔。第一步跑通Java 地址解析的最简调用代码打开你的 IDEA新建一个类先试试最基础的用法。这段代码解决把一行地址拆成结构化字段的问题import com.neo.address.parse.AddressParse; import com.neo.address.parse.ParseResult; import java.util.List; public class QuickStart { public static void main(String[] args) { String raw 太阳鲜鲜 盐田区山海四季城F栋17A13111111111; ListParseResult results AddressParse.parse(raw); for (ParseResult r : results) { System.out.println(r.format()); } } }把项目编译后跑起来控制台输出是这样的姓名太阳鲜鲜电话手机13111111111省广东省市深圳市区盐田区详细地址山海四季城F栋17A类型AREA入口就是静态方法AddressParse.parse(String)一行调用不 new、不配置返回的 ParseResult 自带format()方便调试时直接打印姓名、手机号、省、市、区、详细地址各归各位全部分离干净。读懂 ParseResult每个字段分别存了什么ParseResult的字段值得花 30 秒记一下后面取数据全靠它字段含义示例name收货人姓名太阳鲜鲜mobile手机号含 86 前缀13111111111phone座机号0755-22107333province/city/area省 / 市 / 区县广东省 / 深圳市 / 盐田区detail详细地址山海四季城F栋17AzipCode邮政编码100000type命中层级省/市/区AREA值得注意的是一次解析可能返回多条结果。原因藏在 AddressParse.java 的parseArea里它先按省正向匹配再按市、按区县逆向匹配三种路径各产生一条候选。比如深圳市龙岗区既会被市路径命中也会被区路径命中。所以下一步我们要做的就是学会从候选里挑最优解。进阶示例批量解析 45 条真实订单地址的完整流程与其一个个试不如直接把项目里 AddressParseTest.java 的 45 条真实脏数据拿来跑。这段代码解决批量解析 从多条候选中挑最优的问题import com.neo.address.parse.AddressParse; import com.neo.address.parse.AreaEnum; import com.neo.address.parse.ParseResult; import com.google.common.collect.Lists; import java.util.List; public class BatchDemo { // 挑选最优结果优先区县级其次市级最后省级 private static ParseResult pickBest(ListParseResult results) { ParseResult best null; for (ParseResult r : results) { if (best null || r.getType().getCode() best.getType().getCode()) { best r; } } return best; } public static void main(String[] args) { ListString orders Lists.newArrayList( 谢先生深圳市龙岗区南湾街道尚峰花园4C2231 13111111111, 收货人: 杨燕艳\n手机号码: 13111111111\n所在地区: 广东省深圳市龙岗区龙岗街道, 湛江市廉江市车板镇人才市场0755-22107333.曹建林 邮编713200, 何花菊86-13311111111辽宁省 盘锦市 盘山县 东郭镇 000000 ); for (String raw : orders) { ParseResult r pickBest(AddressParse.parse(raw)); System.out.printf(原地址: %s%n, raw); System.out.printf(- 姓名%s 手机%s 电话%s 省%s 市%s 区%s 邮编%s%n, r.getName(), r.getMobile(), r.getPhone(), r.getProvince(), r.getCity(), r.getArea(), r.getZipCode()); System.out.printf(- 详细地址: %s%n%n, r.getDetail()); } } }AreaEnum里PROVINCE0、CITY1、DISTRICT2code 越大粒度越细直接当优先级用换行、繁体电話、86-前缀手机号、邮编都被cleanAddress和正则预处理过了你不用自己写清洗逻辑项目 README 里的测试数据显示45 条地址批量跑完约 112ms单条毫秒级高并发场景也扛得住。避坑清单这些坑我帮你踩过了用这个库跑了几轮真实数据有几个点必须提前告诉你1. 多条候选结果要自己排序去重。这是最容易忽略的。同一个输入可能同时出 AREA、CITY、PROVINCE 三条直接存库会重复。上面pickBest的按 type 优先级挑选思路可以直接复用。2. 同名区县存在误匹配风险。比如深圳市南山区在按区逆向解析时可能被匹配成黑龙江鹤岗市的南山区。所以当输入自带省名时优先取省路径的结果多一个来源交叉验证更稳。3. 初始化有一次性成本。静态代码块加载整棵行政区划树日志显示约 440ms。生产环境建议应用启动时预热一次比如 Spring 的PostConstruct里调一次parse别等第一个请求进来才初始化。4. 想扩展关键词过滤改一处就行。AddressParse.EXCLUDE_KEYS是公开的静态列表默认包含收货人、所在地区、联系电话等冗余词。如果你们业务里还有门店自提代收点这类词往里 add 就行下次解析自动生效。5. 数据文件路径是固定的。目前读取的是 classpath 下的/address-parse/china-area.json行政区划有调整时替换这个 JSON 即可无需改代码。三种方案的量化对比正则、第三方 API 与本地解析库聊到最后用一张表说清楚它值不值得用对比维度手写正则第三方 APIaddress-parse省市区识别需要维护海量词表开箱即用内置全量数据姓名/电话分离边界情况多支持支持调用成本免费按次计费免费网络依赖无有可能超时无本地运行单条耗时取决于正则质量百毫秒级网络毫秒级维护成本高天天补正则中跟版本低换 JSON 即可它的定位很清晰在不想为解析付 API 费用、又不愿维护正则词表的场景里本地化解析是性价比最高的中间路线。立即动手克隆仓库并运行内置测试用例现在就可以上手按这个顺序走克隆仓库到本地git clone https://gitcode.com/gh_mirrors/addr/address-parse用mvn compile编译依赖Guava、Hutool、commons-lang3 等都在 pom.xml 里配好了不用自己折腾直接运行 AddressParseTest.java 的main方法看 45 条脏地址的完整解析效果然后把你手头最头疼的那批真实地址丢进去验证下准确率需要扩展时改EXCLUDE_KEYS、换china-area.json源码注释都很清楚。如果你也在为收货地址解析头疼与其继续堆正则不如花十分钟把这个库跑起来。它解决的不只是拆字段这一个动作而是把地址标准化这件事从日常维护里彻底摘了出去。试试看你可能会和我一样把它写进工具集里再也没拿出来过。【免费下载链接】address-parseJava 版智能解析收货地址项目地址: https://gitcode.com/gh_mirrors/addr/address-parse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表