正则表达式从地址字符串中提取英国邮政编码的一部分

时间:2011-12-28 11:23:17

标签: javascript regex postal-code

我真的不太了解正则表达式我自己解决这个问题......

我正在使用地理定位API,我的目标是大致了解访问者的下落,以便我可以列出该特定区域提供的服务。

这是通过邮政编码字符串的前导部分完成的。例如n17 9ht,我感兴趣的是n17

这一切都很公平,但我在chrome和IE9中获得了不同的输出,firefox的里程更好,并自动返回postalCode字符串。

  • chrome:2 Castlebar Park, London, Greater London W5 1BX, UK
  • ie9:3-6 Mt Ave, London Borough of Ealing, London W5, UK

虽然这些都不是我的地址,但W5是正确的。

问题是,如何从我给出的两个可能的字符串中提取W5?

显然,字符串被,分割,所以我期待从字符串中获取W5(或任何可能的英国邮政编码领导部分),如下所示:

  • Greater London W5 1BX
  • London W5

邮政编码的两部分之间总是有空格(如果提供了2-nd)。

我不关心BFPO / GIR情况所以它几乎只是第1部分,它可以像n1ec3a一样简单 - 所以我认为,逻辑需要是:

  1. 提取完整或部分邮政编码。
  2. 参加第1部分(或唯一部分)并传递它。
  3. 任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

以下是根据Wikipedia article(包括部分)支持所有英国邮政编码语法的最长正则表达式之一:

([A-Z]?\d(:? \d[A-Z]{2})?|[A-Z]\d{2}(:? \d[A-Z]{2})?|[A-Z]{2}\d(:? \d[A-Z]{2})?|[A-Z]{2}\d{2}(:? \d[A-Z]{2})?|[A-Z]\d[A-Z](:? \d[A-Z]{2})?|[A-Z]{2}\d[A-Z](:? \d[A-Z]{2})?),\s*UK$

我没有正确测试,但至少适合你的情况。

答案 1 :(得分:1)

我不熟悉英国的邮政编码,但您似乎已经说过已经删除了地址的其他部分,您已将地址缩小为:

[Some words] [several-character code] [optional three-character code]

你想要两个字符的代码。如果这是正确的,那么可能是这样的正则表达式:

/\s([^\s]{2,4})(?:\s...)?$/

然后.match()将返回您想要的位:

var addressPart = "Greater London W5 1BX",

alert(addressPart.match(/\s([^\s]{2,4})(?:\s...)?$/)[1]); // "W5"

(当然你实际上可以测试.match()的回报以确保它有效,但是如果它有效,那么你想要的那个就是匹配数组的第二个元素。)

狡猾的演示:http://jsfiddle.net/HjD7w/1/

编辑:我怀疑这不会很有效,因为在某些情况下,城市名称的最后一个字可能会被误认为是邮政编码的第一部分,但是如果有关于字母和数字字符如何适应的固定规则您可以修复它的邮政编码。 (虽然我不知道规则。)