在项目中遇到需要将一段输入的地址分别解析出省、市、区县、镇、以及详细的地存储在数据库中。
这个需求我用的是正则表达式进行进行匹配解析,然后存储到对象,具体的代码如下
1.地址解析工具类,根据正则表达式依次解析出,省、市、区县、镇、以及详细的信息
public static Address addressResolution(String address) {
address = ProviceEnum.getNameByS(address);
String regex = "(?<province>[^省]+自治区|.*?省|.*?特别行政区|.*?市)" +
"(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)" +
"(?<district>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?" +
"(?<town>[^区]+区|.+镇|.+乡)?" +
"(?<detail>.*)";
Matcher m = Pattern.compile(regex).matcher(address);
if (m.find()) {
String province = m.group("province");
String city = m.group("city");
String district = m.group("district");
String town = m.group("town");
String detail = m.group("detail");
// Trim the groups.
province = province == null ? "" : province.trim();
city = city == null ? "" : city.trim();
district = district == null ? "" : district.trim();
town = town == null ? "" : town.trim();
detail = detail == null ? "" : detail.trim();
// Combine the parts into a single Address object.
return new Address(province, city, district, town, detail);
}
return null; // Return null
}
2.存储详细的地址对象
@Data
public class Address {
private String province;
private String city;
private String district;
private String town;
private String detail;
public Address(String province, String city, String district, String town, String detail) {
this.province = province;
this.city = city;
this.district = district;
this.town = town;
this.detail = detail;
}
public Address() {
}
}
运行的结果
但是这种正则表达式在解析直辖市的时候就出错
造成直辖市解析不出来的原因是因为这个正则表达式的写法是从省开始进行解析。如果去解析四大直辖市时就缺少province这个级别,因此在这段地址的前面加上province这个级别就可以正确的进行解析
但这种写法前端传递的时候绵阳带上province这个级别还是不能够正确的解析
于是我想到了后端直接判断四大直辖市,利用字符串的拼接进行正确的地址解析
这里我利用的时枚举 具体代码如下
public enum ProviceEnum {
TIANJING("天津市"),
BEIJING("北京市"),
SHANGHAI("上海市"),
CHONGQING("重庆市");
private String name;
ProviceEnum(String name) {
this.name = name;
}
public static String getNameByS(String address) {
StringBuilder stringBuilder = new StringBuilder();
for (ProviceEnum proviceEnum : ProviceEnum.values()){
if (address.startsWith(proviceEnum.name)){
stringBuilder.append(proviceEnum.name).append(address);
address = stringBuilder.toString();
}
}
return address;
}
}
然后就需要在正则表达式开始之前调用方法进行字符串的拼接
最后运行结果就能够正确的解析出地址
总结:因为我这个正则表达式出现了这种解析不出直辖市的情况,我换掉其他的正则表达式 还是出现了一定的问题,因为刚好只有直辖市四种情况的是列外的 所有我就想到了利用字符串拼接的方式来完成需求。可能这种方法存在一定的歧义,但是目前对于我的需求还是可行的。