我想将地址拆分为城市,州和邮政编码。
现在使用我当前的正则表达式模式,我已经可以获取邮政编码和州,但我在匹配城市时遇到了问题。
这是我目前的模式
/'s*([^,]+?)'s*((?:'w{2,3}|(AVE))[A-Z]+?(?:'s[A-Z]+)?)'s*('w{2})'s*('d{5}(?:-'d{4})|'d{5}(?:-'s'd{4})?)/
演示 : https://regex101.com/r/kQ2dE7/1
通过上面的演示,我能够正确匹配城市,但这不适用于其他类型的地址。
https://regex101.com/r/kQ2dE7/2
https://regex101.com/r/kQ2dE7/4
我希望第一个捕获组只匹配到一个有数字的单词或一个只有数字的单词或像ST,CT,AVE,DR这样的单词。
例如:
11111 A 湾路 AAA111 阳光岛海滩 FL 33160-4266
11111 A湾路 AAA111
阳光岛海滩
佛罗里达州
33160-4266
第一个匹配组应检查它是否包含"ST"/"CT"/"DR"/"AVE"或带数字的单词。然后它将匹配直到该词。
此外,如果字符串中有两个该单词的实例,则它应该匹配到最远的单词。
例:
111 11TH ST AAAA2 布鲁克林 NY 11209- 4940
111 第11街AAAA2
布鲁克林
纽约
11209- 4940
(在此示例中,ST 和带有数字的单词存在,然后它应该匹配,直到带有数字的单词。
这就是为什么我尝试创建一个条件语句来匹配我的正则表达式模式中的某些单词。如何在正则表达式中实现这一点?
- 备择
AVE
在群(?:'w{2,3}|(AVE))
中是无用的,因为AVE
已经由'w{2,3}
匹配。 - 组
(?:'w{2,3}|(AVE))
在第二个捕获组中是无用的 - 它只匹配城市的 2 或 3 个第一个字符; 但是城市名称应该从单词边界开始,所以让我们用'b
替换这个组。 - 城市名称的空格分隔的尾随部分可能出现不止一次(如
SUNNY ISLES BEACH
,因此组(?:'s[A-Z]+)
必须具有量词*
而不是?
。 -
('d{5}(?:-'d{4})|'d{5}(?:-'s'd{4})?)
可以简化为('d{5}(?:-'s?'d{4})?)
. -
第一个匹配组应检查它是否包含"ST"/"CT"/ "DR"/"AVE"或带数字的单词。然后它将匹配直到该词。
此外,如果字符串中有两个该单词的实例,则 应该匹配到最远的单词。
我认为你的意思是两个或两个以上的实例。第一个捕获组
([^,]+'b(?:ST|CT|DR|AVE|'w*'d'w*)'b)
将满足这些要求。
上述所有更改都在此处合并到您的正则表达式中:https://regex101.com/r/uY7oM1/4
's*([^,]+'b(?:ST|CT|DR|AVE|'w*'d'w*)'b)'s*('b[A-Z]+?(?:'s[A-Z]+)*)'s*('w{2})'s*('d{5}(?:-'s?'d{4})?)