JAVA正则匹配小区楼栋房间楼层
 2019-09-27 15:32:24   249   7   

本文最后更新于天前,文中介绍内容及环境可能已不适用.请谨慎参考.

昨天有个小需求,需要从给定的小区详细地址中分离出所属地区/小区名称/楼栋单元/房间号/楼层等数据.

原始数据在xls中,有好几个地市的数据,第一天只给了南京的数据,格式相当统一。

于是把正则捞出来用了下,so easy,
结果第二天又补上了其他地市的数据,

第二天的数据就乱七八糟了,

折腾了半天,算是解决了。正则这个玩意每次都是用到时才会研究下,用完就丢~

这次索性就记录下.

处理

总的数据示例如下:

南京:

"高淳区垠领城市街区2栋3单元506"

吉林:

"吉林市丰满区龙湾公馆25号楼四单元3809", 
"吉林市丰满区御龙湾B10号楼二单元1503", 
"吉林市龙潭区土城子湘潭小区五单元509",
"吉林市昌邑区十一中厚德广厦四单元1008", 
"吉林市昌邑区松江绅苑4栋2单元604",
"吉林市昌邑区昌邑筑石立方空间六单元1510",
"吉林市丰满区八一阳光小镇四单元2810",
"吉林市昌邑区解放北路筑石居易五单元1112",
"吉林市船营区中凯梦之城【32层】1栋1单元502"

重庆:
"地博春天【32层】1栋1单元201"

 

处理正则

南京:
"([^x00-xff]+区)(.*?)(\\d+栋\\d+单元)(\\d*)"

吉林:
"([^x00-xff]+市)([^x00-xff]+?区+?)(.+?)(?:【(\\d+)层】)*((?:(?:\\d+|\\w+)号楼)*(?:\\d+栋)*(?:[一二三四五六七八九十]+|\\d+)单元)+(\\d+)";

重庆:
"(.+?)(?:【(\\d+)层】)*(\\d+栋\\d+单元)(\\d+)"

 

测试代码:

String pattern1 = "([^x00-xff]+区)([^x00-xff]+)(\\d栋\\d单元)(\\d*)";

		String districtName = "";// 区县
		String communityName = "";// 小区
		String buildingName = "";// 楼栋
		String roomName = "";// 房间号
		String roomLayer = ""; // 楼层
		String totalLayer = ""; // 总楼层

		String[] adress = new String[] { "吉林市丰满区龙湾公馆25号楼四单元3809", "吉林市丰满区御龙湾B10号楼二单元1503", "吉林市龙潭区土城子湘潭小区五单元509",
				"吉林市昌邑区十一中厚德广厦四单元1008", "吉林市昌邑区松江绅苑4栋2单元604", "吉林市昌邑区昌邑筑石立方空间六单元1510", "吉林市丰满区八一阳光小镇四单元2810",
				"吉林市昌邑区解放北路筑石居易五单元1112", "吉林市船营区中凯梦之城【32层】1栋1单元502" };

		pattern1 = "([^x00-xff]+市)([^x00-xff]+?区+?)(.+?)(?:【(\\d+)层】)*((?:(?:\\d+|\\w+)号楼)*(?:\\d+栋)*(?:[一二三四五六七八九十]+|\\d+)单元)+(\\d+)";

		Pattern pattern = Pattern.compile(pattern1);
		Matcher mat = pattern.matcher("建邺区融侨中央花园2栋3单元1605");

		for (String fullAdress : adress) {
			pattern = Pattern.compile(pattern1);
			mat = pattern.matcher(fullAdress);
			if (mat.find()) {

				int findnum = mat.groupCount();
				try {

					districtName = mat.group(2);
					communityName = mat.group(3);

					totalLayer = (mat.group(4)==null)?"":mat.group(4);
					buildingName = mat.group(5);
					roomName = mat.group(6);
					
					if (roomName.length() == 3)
						roomLayer = roomName.substring(0, roomName.indexOf("0"));
					else if (roomName.length() == 4)
						roomLayer = roomName.substring(0, 2);

					System.out.println(fullAdress + ":" + districtName + "  / " + communityName + " /" + buildingName
							+ "/ " + roomName + " / " + roomLayer +" 总层:"+totalLayer);
				} catch (Exception e) {
					logger.error(e.getMessage());
				}
			} else {
				logger.info(fullAdress + " no match!");
			}
		}

 

吉林结果:

吉林市丰满区龙湾公馆25号楼四单元3809:丰满区  / 龙湾公馆 /25号楼四单元/ 3809 / 38 总层:
吉林市丰满区御龙湾B10号楼二单元1503:丰满区  / 御龙湾 /B10号楼二单元/ 1503 / 15 总层:
吉林市龙潭区土城子湘潭小区五单元509:龙潭区  / 土城子湘潭小区 /五单元/ 509 / 5 总层:
吉林市昌邑区十一中厚德广厦四单元1008:昌邑区  / 十一中厚德广厦 /四单元/ 1008 / 10 总层:
吉林市昌邑区松江绅苑4栋2单元604:昌邑区  / 松江绅苑 /4栋2单元/ 604 / 6 总层:
吉林市昌邑区昌邑筑石立方空间六单元1510:昌邑区  / 昌邑筑石立方空间 /六单元/ 1510 / 15 总层:
吉林市丰满区八一阳光小镇四单元2810:丰满区  / 八一阳光小镇 /四单元/ 2810 / 28 总层:
吉林市昌邑区解放北路筑石居易五单元1112:昌邑区  / 解放北路筑石居易 /五单元/ 1112 / 11 总层:
吉林市船营区中凯梦之城【32层】1栋1单元502:船营区  / 中凯梦之城 /1栋1单元/ 502 / 5 总层:32

 

总结

^x00-xff  匹配所有双字节的,此处主要是匹配汉字.

 

[^x00-xff]+?区+?  匹配到一个区就ok, 匹配小区名称,

.+?       楼栋单元前的全部最小数据

当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串

,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。


((?:(?:\\d+|\\w+)号楼)*(?:\\d+栋)*(?:[一二三四五六七八九十]+|\\d+)单元)+

?:   匹配 pattern 但不捕获该匹配的子表达式

(?:(?:\\d+|\\w+)号楼)*      25号楼 /B10号楼

(?:\\d+栋)*          xx栋

(?:[一二三四五六七八九十]+|\\d+)单元  xx单元

 


 2019-09-27 16:06:44 
 0

  本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵 固定链接: 【JAVA正则匹配小区楼栋房间楼层】 转载请注明



发表新的评论
{{s_uid}}   , 欢迎回来.
您的称呼(*必填):
您的邮箱地址(*必填,您的邮箱地址不会公开,仅作为有回复后的消息通知手段):
您的站点地址(选填):
留言:

∑( ° △ °|||)︴

(๑•̀ㅂ•́)و✧
<( ̄) ̄)>
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
[]~( ̄▽ ̄)~*
( ̄ˇ ̄)
╮( ̄▽ ̄)╭
( ̄ε(# ̄)
(⊙ˍ⊙)
( ̄▽ ̄)~*
∑( ° △ °|||)︴

文章分类

可能喜欢 

KxのBook@Copyright 2017- All Rights Reserved
Designed and themed by 野生的喵喵   1345587   38303