我使用以下正则表达式来验证北美邮政编码:
(?:(\d{5})(?:-\d{4})?)|(?:([a-zA-Z]\d[a-zA-Z]) ?(\d[a-zA-Z]\d))
仅供参考,我理解在确认某些职位的某些角色方面可能会更准确。
我想要做的是使用相同的验证常量来提取格式的邮政编码:
00000
or
a0a0a0
上面的正则表达式很接近;如果我连接所有捕获组(除了根),我得到我寻求的结果。例如,美国代码将在第1组中捕获,或者加拿大代码将在2 + 3中捕获。
有更好的方法吗?或者可能假设它是正则表达式库的一个特性,用于连接所有子组。 (顺便说一下,这是C#.NET)
答案 0 :(得分:0)
我会让您的第二个(([a-zA-Z]\d[a-zA-Z])
)和第三个((\d[a-zA-Z]\d)
)群体处于被动状态,但使加拿大代码组((?:([a-zA-Z]\d[a-zA-Z]) ?(\d[a-zA-Z]\d))
现在被动)非被动。在这种情况下,将只有两个非被动组:一个用于美国代码,一个用于加拿大。我还要为每个组添加word boundaries:
var regex = new Regex(@"\b(?:(\d{5})(?:-\d{4})?)\b|\b((?:[A-Z]\d[A-Z]) ?(?:\d[A-Z]\d))\b", RegexOptions.IgnoreCase);
var input = @"00000 or a0a 0a0 and not 11111a or b1b1b11";
var postalCodes = regex.Matches(input)
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
这将匹配00000
和a0a 0a0
,但会跳过不正确的11111a
和b1b1b11
。