用正则表达式提取地址中的省、市、区等信息

分类: 直播365体育 时间: 2025-10-10 03:10:17 作者: admin 阅读: 1890
用正则表达式提取地址中的省、市、区等信息

=Start=

缘由:

最近对这一块的内容比较感兴趣,所以收集整理了一些这方面的内容,方便以后有需要的时候参考和使用。

正文:

参考解答:

这个功能说白了其实就是字符串处理,但因为国内的省市区地址可能性非常多,所以不方便用常规的字符串方法进行处理,这时使用正则表达式是一个不错的选择(只能保证提取结果的大概准确,因为实际生活中的情况各种各样,很难完全匹配,除非在填写输入的时候就进行严格控制,但这在大部分情况下都是不现实的)。

这里一方面是为了实现信息提取的功能,另一方面也是想借此顺便熟悉一下正则表达式的捕获组的使用。

因为用到的是正则表达式的捕获组的概念,先简单整理一下捕获组的概念和用法:

捕获组分为:

普通捕获组(Expression)命名捕获组(?Expression)

普通捕获组:

从正则表达式左侧开始,每出现一个左括号”(“记做一个分组,分组编号从 1 开始。0 代表整个表达式。即,(Expression)。

命名捕获组:

每个以左括号开始的命名捕获组(?Expression),都紧跟着 ?,而后才是正则表达式。

非捕获组:

在左括号后紧跟 ?:,而后再加上正则表达式,构成非捕获组 (?:Expression)。

然后再整理一下中国各省级城市列表:

34个省级行政单位:23个省、4个直辖市、2个特别行政区、5个自治区。

我国共有34个省级行政区,其中:· 直辖市有4个:北京市(京)、天津市(津)、上海市(沪)、重庆市(渝)。· 特别行政区有2个:香港特别行政区和澳门特别行政区。· 自治区有5个:新疆维吾尔自治区(新)、宁夏回族自治区(宁)、西藏自治区(藏)、广西壮族自治区(桂)、内蒙古自治区(内蒙古)。· 省份有23个:河北省(冀)、山西省(晋)、辽宁省(辽)、吉林省(吉)、黑龙江省(黑)、江苏省(苏)、浙江省(浙)、安徽省(皖)、福建省(闽)、江西省(赣)、山东省(鲁)、河南省(豫)、湖北省(鄂)、湖南省(湘、)广东省(粤)、海南省(琼)、四川省(川、蜀)、贵州省(黔、贵)、云南省(滇、云)、陕西省(陕、秦)、甘肃省(甘、陇)、青海省(青)、台湾省(台)。

最后再把网上找到的Java代码片段放一下,方便使用(也可以按需进行微调):

import java.util.ArrayList;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class AddressResolutionUtil {

public static String regex = "(?[^省]+自治区|.*?省|.*?行政区|.*?市)(?[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)(?[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?[^区]+区|.+镇)?(?.*)";

public static Pattern pattern = Pattern.compile(regex);

public static List> addressResolution(String address) {

Matcher m = pattern.matcher(address);

String province = null, city = null, county = null, town = null, village = null;

List> table = new ArrayList>();

Map row = null;

while(m.find()) {

row = new LinkedHashMap();

province = m.group("province");

row.put("province", province==null ? "" : province.trim());

city = m.group("city");

row.put("city", city==null ? "" : city.trim());

county = m.group("county");

row.put("county", county==null ? "" : county.trim());

town = m.group("town");

row.put("town", town==null ? "" : town.trim());

village = m.group("village");

row.put("village", village==null ? "" : village.trim());

table.add(row);

}

return table;

}

public static void main(String[] args) {

System.out.println(addressResolution("湖北省武汉市洪山区"));

System.out.println(addressResolution("湖北省恩施土家族苗族自治州恩施市"));

System.out.println(addressResolution("北京市市辖区朝阳区"));

System.out.println(addressResolution("内蒙古自治区兴安盟科尔沁右翼前旗"));

System.out.println(addressResolution("西藏自治区日喀则地区日喀则市"));

System.out.println(addressResolution("海南省省直辖县级行政单位中沙群岛的岛礁及其海域"));

System.out.println(addressResolution("陕西省延安市宝塔区麦克大厦"));

}

}

参考链接:

java从地址串中解析提取省市区-完美匹配中国所有地址 https://blog.csdn.net/superSubfn/article/details/80290491

java 从字符串中提取省、市、区、镇、乡等区域名称(包含少数民族地区) https://blog.csdn.net/qq_40083897/article/details/83048587

用正则表达式切割详细地址中的省、市、区 https://blog.csdn.net/qq_38584262/article/details/86302509

JAVA实现地址解析功能 https://blog.csdn.net/renfng/article/details/94738164

中国各省份城市列表 http://www.maps7.com/china_province.php

Java 正则表达式 https://www.runoob.com/java/java-regular-expressions.html

JAVA正则表达式语法示例与语法大全 https://www.w3cschool.cn/regexp/x9hf1pq9.html

[疯狂Java]正则表达式:捕获组、反向引用、捕获组命名 https://blog.csdn.net/Lirx_Tech/article/details/51721491

深入入门正则表达式(java) – 命名捕获 https://blog.csdn.net/su1216/article/details/49407381

Java 正则表达式的捕获组(capture group) https://www.runoob.com/w3cnote/java-capture-group.html

正则表达式的捕获组(Java) https://www.cnblogs.com/lyy-blog/p/9817361.html

=END=

相关文章

CSGO弯刀攻略:如何选择和使用最佳的弯刀
《西游记》取经路线图:人最大的修行,其实是修心 作者:洞见ciyu话说孙悟空为了学艺,不惜跋山涉水到西牛贺洲,去拜菩提祖师为师。菩提祖师道场名为:灵台方寸山,斜月三星洞...
扔旧衣服禁忌:处理自己或他人旧衣服的正确方式