Canadian postal code regex?
在邮政编码字段中,只有以下格式应该是有效的。
B1C 2B3 或 B1C3D3
如何为此编写正则表达式?
编辑:
1
|
^([a–zA–Z]\\d[a–zA–z]( )?\\d[a–zA–Z]\\d)$
|
这是我的正则表达式,但它只接受 B1C C1B(注意中间有空格)格式。即使没有空间也应该是有效的
- 你尝试了什么?你有什么问题?
- 这是 C# 而不是 VB.NET,但我希望它可以翻译:stackoverflow.com/questions/1146202/
- 如果这些是您期望的仅有的三个值,那么 B1C|C1B|B1CC1B 正则表达式有什么问题?
- @SLaks : “^([a-zA-Z]\\\\\\\\d[a-zA-z]( )?\\\\\\\\d[a-zA-Z]\\\\\\\\d)$”这是我的正则表达式,但它只接受 B1C C1B(注意之间的空格)格式。即使没有空间也应该是有效的
- 我不认为你想要空间周围的括号。
- 那些不是有效的加拿大邮政编码。格式为A0A 0A0,其中A 代表字母,0 代表数字。
- @VadimK 他的正则表达式是正确的,但不是他的例子
您希望根据地址数据库验证邮政编码。并非 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 Private Function CanBeValidCanadianPostalCode(postal_code As String) As Boolean |
这里有一些真正的不一致之处。您提供的正则表达式 ^([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 |
- 实际上正则表达式是 [A-Z][0-9][A-Z] ?[0-9][A-Z][0-9] AAA AAA 不是有效的加拿大邮政编码。 B1C\\t0A2 也不是(操作的原始示例也是错误的)
- @ScottChamberlain,我很抱歉,我会采用 OP 当前的正则表达式并修复它。
- @ScottChamberlain,我修复了它,但是 OPs 问题存在一些真正的不一致之处。
- 这可以用不区分大小写的标志来缩短,然后 a-zA-Z 可以是 A-Z
使用以下正则表达式进行加拿大邮政编码验证
1
|
^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A–Z]{1} *\\d{1}[A–Z]{1}\\d{1}$
|
- 这是正确的答案。
来源:https://www.codenong.com/16614648/