0

我有以下用于验证北美邮政编码的正则表达式:

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

仅供参考,我知道在验证某些位置的某些字符方面可能更准确。

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

00000
  or
a0a0a0

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

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

4

1 回答 1

0

我会让你的 2nd( ([a-zA-Z]\d[a-zA-Z])) 和 3rd( (\d[a-zA-Z]\d)) 组被动,但让加拿大代码组((?:([a-zA-Z]\d[a-zA-Z]) ?(\d[a-zA-Z]\d))现在是被动的)非被动。在这种情况下,将只有两个非被动组:一个用于美国代码,一个用于加拿大代码。另外我会为每个组添加单词边界:

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

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

于 2012-11-14T08:55:52.797 回答