案例1:广东省肇庆市四会市四会大道南,获取结果是:{ province: '广东省',city: '肇庆市',district: '四会市'}
案例2:上海市黄浦区人民大道200号,获取结果是:{province: "上海市",city: "上海市", district: "黄浦区"}
实现方法:
-
正则表达式匹配:通过正则精准识别省、市、区的关键字(如省、市、区、县),适配直辖市等特殊情况。
-
处理直辖市:直接匹配直辖市名称,并自动将市级名称与省级同步。
-
逐步截取:每提取一级信息后,截取剩余地址继续解析,确保层级准确。
-
兼容性:能处理大多数标准格式的国内地址,包括省→市→区或直辖市→区的结构。
// 在methods或工具函数中定义地址解析方法
parseAddress(address) {
let province = '', city = '', district = '';
// 处理省份/直辖市
const provinceMatch = address.match(/^(.*?(省|北京市|天津市|上海市|重庆市))/);
if (provinceMatch) {
province = provinceMatch[1];
address = address.substring(province.length);
// 如果是直辖市,市级名称与省级相同
if (province.endsWith('市')) {
city = province;
}
}
// 处理市级(非直辖市情况)
if (!city) {
const cityMatch = address.match(/^(.*?市)/);
if (cityMatch) {
city = cityMatch[1];
address = address.substring(city.length);
}
}
// 处理区/县
const districtMatch = address.match(/^(.*?[区县市])/);
if (districtMatch) {
district = districtMatch[1];
}
return { province, city, district };
}
// 解析省市区
const { province, city, district } = this.parseAddress("上海市黄浦区人民大道200号");
打印结果:
{
province: "上海市",
city: "上海市", // 直辖市名称与省级一致
district: "黄浦区"
}