0

我希望我的正则表达式能够识别以邮政编码结尾并以数字开头的街道地址。

所以如果我的示例字符串是

'abcd 123 abcd 1600 Penn Ave. Washington D.C. 12345 hello, world'

我希望它只匹配

1600 Penn Ave. Washington D.C. 12345

我坚持使用

.match(/\d+.*\d{5}/)

但这会返回

123 abcd 1600 Penn Ave. Washington D.C. 12345

我怎样才能让它返回最接近的数字实例?

4

3 回答 3

0

这也是您的一个选择:

.match(/\d+(\s(\D+|\d+\D{2})){3,6}\d{5}/)

这表示:

  1. 寻找一组数字
  2. 确保后面跟着 3 到 6 组:(一个空格 + 一些字符)。这些字符可以是非数字,也可以是数字和两个字母的组合。正如 The Tin Man 所提到的,后一种类型的组 ,\d+\D{2}将在您的地址中处理诸如1st3rd等位。但它不会匹配Apt。2正确。
  3. 为您的组提供 3 到 6 之间的数字范围,您当然可以调整这些数字,这样您的正则表达式将匹配稍微不同的地址。
  4. 确保比赛结束时有邮政编码

PS Rubular是你的朋友。

于 2013-01-21T22:34:19.553 回答
0
.match(/\d+(\D)*?\d{5}/)

我打赌上面可能是你想要的。基本上,如果您不希望中间有多余的数字,您可以使用(\D)而不是(.). 额外?的告诉正则表达式解释器进行不情愿匹配而不是贪婪匹配。换句话说,解释器会返回最短的匹配。

贪婪与不情愿的一个好问题。

于 2013-01-21T22:34:24.297 回答
0

您的模式的问题是正则表达式默认是贪婪的。.*抓得太多了,需要被告知要更有选择性。此外,.将抓取任何类型的角色,这可能不是您想要的。

我将从/(\d+\D+?\d{5})/哪个捕获开始:

1600 Penn Ave. Washington D.C. 12345

例如:

'a 123 a 1600 Penn Ave. Washington D.C. 12345 foo'[/(\d+\D+?\d{5})/, 1]
=> "1600 Penn Ave. Washington D.C. 12345"

图案的意思是:

  1. 从至少一位数字开始...
  2. 后跟至少一个非数字,选择要达到的最小数量...
  3. 一个五位数的号码。

如果您获得的地址具有以数字命名的街道,例如1st.

于 2013-01-21T22:39:27.623 回答