正则表达式解析地址时出现额外空捕获组的问题求助
地址解析正则问题:空分组原因及修复
问题出在你嵌套了不必要的捕获组,而且重复的捕获组只会保留最后一次匹配的结果,当最后一次匹配里的可选空格\s?捕获到空值时,就会出现空分组。
为啥会有空分组?
看你写的正则:
(^\d+\w?)\s((\w*\s?)+).\s(\w*\s?)+([A-Z]{2})\s(\d{5})
- 分组2里套了分组3
(\w*\s?),这个+会反复匹配\w*\s?,每次匹配都会覆盖分组3的内容。匹配63rd Ave NE时,最后一次(\w*\s?)会匹配NE后面的空(因为\s?是可选的),所以分组3最终是空的。 - 同样,匹配城市
Lake Forest Park的(\w*\s?)+里套了分组4,最后一次匹配的是Park后面的空,导致分组4为空。
修复后的正则
把多余的嵌套捕获组改成非捕获组(用(?:...)代替(...)),这样就不会生成没用的空分组,同时明确把.改成,,避免误匹配其他字符:
(^\d+\w?)\s((?:\w*\s?)+),\s((?:\w*\s?)+)([A-Z]{2})\s(\d{5})
对应分组说明
- 分组1:门牌号(
5173B) - 分组2:街道名称(
63rd Ave NE) - 分组3:城市(
Lake Forest Park) - 分组4:州(
WA) - 分组5:邮政编码(
98155)
内容的提问来源于stack exchange,提问作者darrylonvinyl
相关产品推荐
相关产品推荐

