正则表达式:需要验证单个,多个或一系列邮政编码的输入

时间:2011-09-07 23:49:41

标签: c# regex

我需要验证可以接受的(四位数)邮政编码字段:

  1. 单个邮政编码(例如4009) - >它必须是四位数
  2. 以逗号分隔的多个邮政编码(例如4002,5001)
  3. 使用连字符的一系列邮政编码(例如4000-4010)
  4. 以逗号分隔的#1和#3的任意组合(例如4000,4002,4005-4010,5001)
  5. #4的另一个例子是:4000-4007,5000

    如何在C#中使用正则表达式进行验证。我的问题更多的是关于如何构建模式本身。谢谢。

    更新

    这就是我提出的(使用正则表达式的输入):

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return true;
        }
    
        var stringValue = value.ToString().Replace(" ", "");
    
        foreach (var pc in stringValue.Split(','))
        {
            if(!Regex.Match(pc, @"^(\d{4})$|^(\d{4}-\d{4})$").Success)
            {
                return false;
            }
        }
    
        return true;
    }
    

    我有点希望在不必执行string.Split()的情况下进行验证。我不确定这是否可行。如果有人有更好的想法,请在这里发布。谢谢。

3 个答案:

答案 0 :(得分:0)

你需要的正则表达式是

^\d{4}(-\d{4})?(,\d{4}(-\d{4})?)*$

这是以逗号分隔的一个或多个范围,其中每个范围是单个邮政编码或邮政编码短划线邮政编码。

如果您想要效率,则需要制作非捕获组,如

^\d{4}(?:-\d{4})?(,\d{4}(?:-\d{4})?)*$

答案 1 :(得分:0)

这应该可以解决问题,并在各个组件之间允许可选的空格:

^\s*(\d{4}(\s*-\s*\d{4}))(\s*,\s*(\d{4}(\s*-\s*\d{4})))*\s*$

答案 2 :(得分:0)

^((\d{4})([,-])?)+$

怎么样?

编辑:那个匹配在80789809以及

新:^(\d{4})(([,-])(\d{4}))*$

经过测试:

4000,4002,4005-4010,5001 yes
4000-4007,5000 yes
4000-4010 yes
4002,5001 yes
4009 yes
40004002,4005-1010,5001 no
4000-4007, 5000 no
40004010 no
4002,50012345 no
4009, no