开发者

Regex: need to validate input for single, multiple or a range of postcodes

开发者 https://www.devze.com 2023-04-03 15:04 出处:网络
I need to validate a (four digits) postcode field that can accept: A single postcode (e.g. 4009) -> it has to be four digit

I need to validate a (four digits) postcode field that can accept:

  1. A single postcode (e.g. 4009) -> it has to be four digit
  2. Multiple postcodes separated by comma(s) (e.g. 4002,5001)
  3. A range of postcodes using hyphen (e.g. 4000-4010)
  4. Any combination of #1 and #3 separated by comma(s) (e.g. 开发者_如何学JAVA4000,4002,4005-4010,5001)

Another example of #4 will be: 4000-4007,5000

How can I do validation using regex in C#. My question is more about how to construct the pattern itself. Thank you.

Updates

This is what I came up with (using your inputs on regex):

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;
}

I was kind of hoping to do the validation without having to do string.Split(). I am not sure if that's possible at all. If anyone has better idea, please post it here. Thank you.


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

Edit: That one matched on 80789809 aswell

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

Tested against:

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


This should do the trick, and allow for optional whitespace between the various components:

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


The regex you need is

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

This is one or more ranges separated by commas, where each range is either a single postal code or a postal code dash postal code.

If you want efficiency, you will want to make non-capturing groups, as in

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号