2019-09-27 15:32:24
342
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正则匹配小区楼栋房间楼层】 转载请注明
相关文章:
发表新的评论
文章分类
文章归档
标签
deb ,
,
蓝屏 ,
select ,
html5 ,
tomcat ,
gcc ,
ajax ,
apt-get update ,
选择 ,
js加密 ,
java ,
工作 ,
ocr ,
AngularJs ,
感慨 ,
work ,
click ,
javascript ,
反向代理 ,
ip查询 ,
空间查询 ,
word ,
ECS服务器 ,
centos ,
杂 ,
StartupWMClass ,
前端 ,
js ,
vmdk ,
感概 ,
select2 ,
virtualbox ,
gg代理 ,
share ,
seo ,
风筝 ,
email ,
ASR ,
转换 ,
cool ,
activiti-ui ,
喵小凡 ,
@PropertySource ,
ckeiditor ,
网站攻击 ,
SRILM ,
风景 ,
plugin ,
vdi ,
扩容 ,
chorme ,
阿里云 ,
KALDI ,
num ,
packer2 ,
pic ,
gg镜像 ,
win8.1 ,
ecs ,
mysql ,
Ubuntu ,
快递查询 ,
nginx ,
ubuntu ,
swap ,
maven ,
entropy_avail ,
tencent ,
语音识别 ,
prerender ,
xfce4 ,
进度条 ,
存储过程 ,
activiti ,
熵 ,
日出 ,
练笔 ,
虞美人 ,
nodejs ,
词 ,
demo ,
jquery ,
random ,
linux ,
cat ,
bootstrapValidator ,
angularJs ,
live ,
on ,
gg ,
雪 ,
婚姻 ,
景色 ,
@Autowired ,
pdf ,
emqttd ,
优化 ,
thchs30 ,
opencv ,