【问题标题】:Regex with a large amount of "or's"带有大量“或”的正则表达式
【发布时间】:2012-02-27 00:09:26
【问题描述】:

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

我的街道地址如下所示:

7829 Hollywood Ave

我想写一个这样的正则表达式(伪-ode):

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,这个正则表达式会很大。我必须使用计算机代码实际生成它,这可以,但我不确定这是解决此类问题的好方法吗?

我可以看到这个问题已经到了我想编写一个正则表达式的地步,它试图将街道名称与数据库中的街道名称进行匹配。然后我真的看不出标准正则表达式在这种情况下如何工作:

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

感谢任何输入!

【问题讨论】:

  • 我住过四个你的 reg exp 会失败的地方!
  • 即使对于您现有的正则表达式,我也会将 \s 从所有 OR 案例中移出,并将其放在 ( 之前一次 - 这样可以节省 1600 个字符...
  • 其实1598,你还需要一个实例。 :-)

标签: javascript regex parsing street-address


【解决方案1】:

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

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

【讨论】:

  • 不幸的是,我无法控制用户如何输入地址。
  • 所以你只需要解析输入或者只是接受他们给你的东西。 RegExp 可以帮助进行标记化,但解析将是手动的。
  • 此外,如果您处理的是国际地址,那么事情会变得更加复杂。一些国家将数字放在街道线的尽头。有些地方根本没有编号。一些街道名称中有一个数字。并非所有街道名称都有类型。 (有些地方也不给街道命名,但这是一个你可以忽略的问题。)
【解决方案2】:

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

正则表达式将变为:

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

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

【讨论】:

    【解决方案3】:

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

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

    你可以得到括号内的组的内容(使用 Matcher.getGroup(int))。

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

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

    【讨论】:

    • 我的用例与您假设的非常不同。这与限制用户的输入无关。最终目标是获取有错误的地址数据并纠正错误。
    • JavaScript 捕获组很像 Java 的。但是,关于是否验证用户输入的问题,我不同意。最好的系统会检测用户输入中的错误,而不是默默地失败或简单地计算出错误的答案,而是通知用户他们犯了错误,可能会建议更正。 Google 和许多其他流行网站提供查询完成功能,Office 和 Web 浏览器提供拼写检查功能。如果你想设计好的软件,你必须符合用户的期望。用户希望软件能够指出错误并提供修复。
    • @AdamMihalcin 我很确定用户在写自己的地址时失败太多以至于您无法向他们发送邮件的错误率足够低,以至于无法弥补维护的努力这段代码。并且在地址未列出时引入更多麻烦,您想在其他国家使用系统等。而且我确实认为用户很愚蠢,但只是在某种程度上......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多