1

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

假设我必须排除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

4 回答 4

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

在 Regexr 上查看

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

更新

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

于 2012-11-18T00:10:37.540 回答
1

实际验证在维基百科网站上......谷歌有答案;)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})
于 2012-11-18T00:53:38.637 回答
0

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

28 至 347

然后它变得相当复杂。用文字来表达,你想允许:

    如果是两位数,则允许第一个数字为 2-9,并且:
      如果第一个数字是二,那么第二个数字允许 8/9,
      否则,如果第一个数字是 3-9,则允许第二个数字为 0-9
    Elseif 三位数字,第一个数字允许 1-3,并且:
      如果第一个数字是三,则允许第二个数字为 0-4,并且:
        如果第二个数字是四,则允许第三个数字为 0-7,
        否则,如果第二个数字是 0-3,则允许第三个数字为 0-9。
      否则,如果第一个数字是 1/2,则第二个和第三个数字都允许 0-9。

然后,您可以像这样编写适当的正则表达式,它搜索围绕 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))
于 2012-11-18T00:46:17.190 回答
0

我改变了我的方法。

我没有使用变得越来越复杂的正则表达式,而是保存了英国邮政编码的所有排除外向代码。

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

XX-YYY
XXX-YYY
XXXX-YYY

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

于 2012-11-28T16:43:38.173 回答