具有大量“或”的正则表达式

时间:2012-02-27 00:09:27

标签: javascript regex parsing street-address

编写一些正则表达式来帮助处理街道地址。但是,我不确定正则表达式是否是解决此问题的正确方法。

我的街道地址如下:

7829 Hollywood Ave

我想写一个说这个(伪代码)的正则表达式:

match a NUMBER then ONE OR MORE WORDS then a STREET TYPE

在javascript中,这个正则表达式看起来像这样:

/^\d+\s+.*(\sAve|\sStreet|\sSt.|..800 MORE ABBREVIATIONS!...)/ig

正如您所看到的,因为有800+ postal street "type" abbreviations,这个正则表达式会非常大。我必须使用计算机代码实际生成它,这没关系,但我不确定这是解决这类问题的好方法吗?

我可以看到这个问题到了我想写一个试图将街道NAME与数据库中的一个匹配的正则表达式。然后我真的不明白标准的正则表达式在这种情况下是如何工作的:

match a NUMBER then **A STREET NAME IN A DATABASE** then a STREET TYPE

感谢任何输入!

3 个答案:

答案 0 :(得分:3)

如果所有地址都像<number> <name> <type>一样简单,那么生活将变得非常简单 - 但它们不是,所以事实并非如此。

街道地址对于单个正则表达式而言过于复杂,例如5/45 East 51st St或215-217 Long Island Way。您需要:打破它并解析部分,让用户在特定字段中输入地址,或者只接受他们给你的内容。

答案 1 :(得分:1)

您可以捕获街道类型,然后检查捕获的内容是否在街道类型列表中。

正则表达式将成为:

/^\d+\s+.*\s+(.*)

/^\d+\s+.*\s+(?P<streettype>.*)

答案 2 :(得分:1)

使用捕获组。我不确定JS,但在java中你做:

/ ^(\ d +)\ s +(。*)(\ w +)/ ig

你可以在括号之间获取组的内容(使用Matcher.getGroup(int))。

稍后,您将这些字符串与数据库匹配。

无论如何......为什么?也许街道类型证明了这一点,但限制街道名称只会为您增加更多的工作并给用户带来不便(如果街道的名称与数据库中的名称不完全相同,或者数据库的更新不够)。希望用户指明他的方向吗?如果用户不想,他可以提供虚假数据。用户希望你有他的方向?然后你可以相信用户能够正确地写出来......