【问题标题】:Split UK postcode into two main parts using java使用 java 将英国邮政编码分成两个主要部分
【发布时间】:2011-04-10 10:42:32
【问题描述】:

这个用于验证邮政编码的正则表达式非常有效

^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})$

但我想拆分邮政编码以使用 java 检索邮政编码的各个部分。

这在java中怎么做?

【问题讨论】:

  • 参考:en.wikipedia.org/wiki/UK_Postcodes#Format ...这将是一个地狱般的正则表达式,而且规则可能会改变。你需要这个做什么?
  • 我需要它用于用户可以输入邮政编码的搜索框。我主要对第一部分感兴趣,因此只输入第一部分或完整的有效邮政编码即可满足用例。

标签: java regex postal-code


【解决方案1】:

这里是匹配英国邮政编码的官方正则表达式:

http://interim.cabinetoffice.gov.uk/media/291370/bs7666-v2-0-xsd-PostCodeType.htm

如果您想将找到的邮政编码分成两部分,这不只是在空格上分割的问题吗?英国邮政编码的两部分只是用空格隔开,对吗?在java中这将是:

String[] fields = postcode.split("\\s");

其中 postcode 是经过验证的邮政编码,fields[] 将是一个长度为 2 的数组,包含第一部分和第二部分。

编辑:如果这是为了验证用户输入,并且您想验证第一部分,您的正则表达式将是:

Pattern firstPart = Pattern.compile("[A-Z]{1,2}[0-9R][0-9A-Z]?");

验证第二部分是:

Pattern secondPart = Pattern.compile("[0-9][A-Z-[CIKMOV]]{2}");

【讨论】:

  • 我认为他是在询问没有空格分隔的情况。在这种情况下执行此操作的规则似乎相当复杂。
  • @Pekka - 没有空格的邮政编码将无法通过验证。也许我误解了,但我认为 OP 想要拆分经过验证的地址?
  • @Richard 是的,OP 需要澄清。查看上面的 Wikipedia 链接,也许他需要 all 单独的组件。
  • 在这种情况下,如果没有更仔细地研究这种更优雅的方法,您可能必须检查每个邮政编码的 7 个不同的正则表达式匹配。
  • 由于第二部分似乎总是9AA,OP 应该删除空格和最后三个字符。
【解决方案2】:

我意识到自从提出这个问题以来已经有很长时间了,但我有同样的要求,并认为我会发布我的解决方案以防它帮助那里的人:

const string matchString = @"^(?<Primary>([A-Z]{1,2}[0-9]{1,2}[A-Z]?))(?<Secondary>([0-9]{1}[A-Z]{2}))$";

var regEx = new Regex(matchString);
var match = regEx.Match(Postcode);

var postcodePrimary = match.Groups["Primary"];
var postcodeSecondary = match.Groups["Secondary"];

这不会验证邮政编码,但如果它们之间没有输入空格,它会将其分成两部分。

【讨论】:

  • 您可以在两个组之间添加一个可选的空格,然后它将匹配有或没有空格并分成两部分。我不确定如何在这种正则表达式中做到这一点,但通常类似于 /s?
【解决方案3】:

您可以为此使用 Google 最近的开源库。 http://code.google.com/p/libphonenumber/

【讨论】:

  • 那个图书馆似乎只做电话号码。该页面上与英国邮政编码无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多