关于.net:加拿大邮政编码正则表达式?

Canadian postal code regex?

在邮政编码字段中,只有以下格式应该是有效的。

B1C 2B3 或 B1C3D3

如何为此编写正则表达式?

编辑:

1
^([a-zA-Z]\\d[a-zA-z]( )?\\d[a-zA-Z]\\d)$

这是我的正则表达式,但它只接受 B1C C1B(注意中间有空格)格式。即使没有空间也应该是有效的


您希望根据地址数据库验证邮政编码。并非 A0A0A0 格式的每个邮政编码都是有效的加拿大邮政编码。不存在的邮政编码示例:

1
2
3
Z0Z0Z0
Z9Z9Z9
Y7Y7Y7

关于初步检查,最简单的可能是通过 VB.NET 代码对值进行预处理。您需要删除空格并转换为大写。那么你的正则表达式非常简单:([A-Z]\\d){3}。这是测试的完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
Imports System.Text.RegularExpressions

Module Module1
  Sub Main()
    Console.WriteLine(CanBeValidCanadianPostalCode("B1C 2B3")) 'prints True
    Console.WriteLine(CanBeValidCanadianPostalCode("B1C3D3")) 'prints True
  End Sub

  Private Function CanBeValidCanadianPostalCode(postal_code As String) As Boolean
    Return Regex.IsMatch(postal_code.Replace("","").ToUpper,"([A-Z]\\d){3}")
  End Function
End Module


这里有一些真正的不一致之处。您提供的正则表达式 ^([a-zA-Z]\\d[a-zA-z]( )?\\d[a-zA-Z]\\d)$ 与 Scott 关于正确加拿大格式的陈述相匹配。但是,您提供的示例不遵循格式 B1C C1B or B1CC1B.

为了雪上加霜,您提供的正则表达式使用正确的加拿大格式。所以没有任何真正的理由来改变它。我的意思是,我会把它改成这个 ^([a-zA-Z]\\d[a-zA-Z]\\s?\\d[a-zA-Z]\\d)$ 以便单个空格不被分组,但这只是我。

但是,就使用而言,它可以像这样在 C# 中使用:

1
2
3
4
var matches = Regex.Match(inputString, @"^([a-zA-Z]\\d[a-zA-Z]( )?\\d[a-zA-Z]\\d)$");
if (!matches.Success) {
    // do something because it didn't match
}

现在它已被标记为 VB.NET:

1
2
3
4
Dim matches = Regex.Match(inputString,"^([a-zA-Z]\\d[a-zA-Z]( )?\\d[a-zA-Z]\\d)$")
If Not matches.Success Then
    ' do something because it didn't match
End If


使用以下正则表达式进行加拿大邮政编码验证

1
^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$