使用正则表达式提取北美邮政编码

时间:2012-11-13 19:58:38

标签: .net regex capturing-group

我使用以下正则表达式来验证北美邮政编码:

(?:(\d{5})(?:-\d{4})?)|(?:([a-zA-Z]\d[a-zA-Z]) ?(\d[a-zA-Z]\d))

仅供参考,我理解在确认某些职位的某些角色方面可能会更准确。

我想要做的是使用相同的验证常量来提取格式的邮政编码:

00000
  or
a0a0a0

上面的正则表达式很接近;如果我连接所有捕获组(除了根),我得到我寻求的结果。例如,美国代码将在第1组中捕获,或者加拿大代码将在2 + 3中捕获。

有更好的方法吗?或者可能假设它是正则表达式库的一个特性,用于连接所有子组。 (顺便说一下,这是C#.NET)

1 个答案:

答案 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();

这将匹配00000a0a 0a0,但会跳过不正确的11111ab1b1b11