英国邮政编码的正则表达式

时间:2012-11-17 23:55:15

标签: c# .net regex

我有一个邮政编码列表,应该从我的送货方式中排除。

假设我必须排除Scilly IslesIsle of Man以及其他几个。

对于上述2个区域,有效邮政编码为IM1-IM9,IM86,IM87,IM89。如果是IM25或IM85则无效。

我有以下表达方式。但它即使是IM25或IM 85也会返回。

var regex = new Regex("(PO3[0-9]|PO4[0-1]|GY[1-9]|JE[1-5]|IM[1-9]|TR[1-9])");

如果我通过IM85,我的表达式应该返回false。对于IM1-IM9 ,, IM86,IM87,IM89它应该返回true。

也与TR邮政编码相同。 TR1-TR27是有效的邮政编码。如果我给TR28,它应该返回false。

我正在使用'|'分开多种模式。这是在1个表达式中包含多个模式的正确方法。

4 个答案:

答案 0 :(得分:1)

你期待什么?什么应该匹配,什么不匹配?请举例说明您要测试的字符串。

如果您将模式与“IM25”匹配,它将匹配,因为您在模式中允许IM[1-9],因此您将获得有效的部分匹配。如果你想避免这种情况(我不确定你想要达到什么目的)并且想要在第一个字母后只允许一个数字,请使用“单词边界”\b并准确指定你想要允许的内容,像这样:

(PO3[0-9]|PO4[0-1]|GY[1-9]|JE[1-5]|IM([1-9]|8[6-9])|TR([1-9]|2[0-7]))\b

here on Regexr

这将允许“IM”部分也是6-9作为第二个数字,当之前有8个。

<强>更新

目前还不清楚你的任务背景是什么。我假设你有一个有效的邮政编码列表,可能会更好,你提取邮政编码或只提取它的第一部分(为此你最终可以使用正则表达式)并检查它是否在列表中。< / p>

答案 1 :(得分:1)

实际验证在维基百科网站上... Google有答案;)http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation

(GIR 0AA)|(((A[BL]|B[ABDFHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]{2})

答案 2 :(得分:0)

我仍然认为你需要更多澄清。作为一个巨大的正则表达式家伙,我想指出多位数范围应该尝试放入代码方面,而不是正则表达方面,只是为了你的理智。但我个人喜欢用这种方式玩Regex。正则表达式一次读取一个字符,因此它只识别0到9。不是十,不是二十八。如果您想允许以下内容:

28到347

然后变得相当复杂。 换句话说,你想允许:

    If Two Digits, allow 2-9 for the first digit, and:
      If the first digit is a Two, then allow 8/9 for the second digit,
      ElseIf the first Digit is 3-9, then allow 0-9 for the second digit
    Elseif Three Digits, allow 1-3 for the first Digit, and:
      If the first digit is a Three, then allow 0-4 for the second digit, and:
        If the second digit is a Four, then allow 0-7 for the third digit, 
        ElseIf the second digit is 0-3, then allow 0-9 for the third digit.
      ElseIf the first digit is 1/2, then allow 0-9 for both the Second and Third digits.

然后,你可以编写一个像这样的正确的正则表达式,它搜索一个2对或3对周围的单词边界或非数字。通过这种类型的问题解决,您应该能够找出您的正则表达式问题。否则,让我们更多地了解您想要匹配和不匹配的内容:

(\b|\D)((2[89]|[3-9][0-9])(\b|\D)|(3(4[0-7]|[0-3][0-9])|[12][0-9][0-9])(\b|\D))

答案 3 :(得分:0)

我改变了方法。

我保存了英国邮政编码的所有排除的外向代码,而不是正在变得更复杂的正则表达式。

如果任何邮政编码包含特定的外向代码,则从列表中排除邮政编码。 向外代码采用这种格式

XX-YYY
XXX-YYY
XXXX-YYY

在以上所有格式中,X代表英国邮政编码的外向代码。