【问题标题】:Regex to not match consecutive numbers in a string c#正则表达式不匹配字符串c#中的连续数字
【发布时间】:2016-05-03 11:27:53
【问题描述】:

我的要求是强制执行一个密码策略,其中包含一个规则,即不允许使用“pass1234”、“abc12”、“12tab”等。我目前的正则表达式是:

if(!Regex.IsMatch(password,
                    @"^(?!(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0))\d{1,}|(?:0(?=9)|1(?=0)|2(?=1)|3(?=2)|4(?=3)|5(?=4)|6(?=5)|7(?=6)|8(?=7)|9(?=8))\d{1,})[a-zA-Z\d]+$")))

但上面的正则表达式匹配以数字开头的字符串,即“12abc”、“12pass”,但不匹配字符串之间包含数字的字符串,如“ab12pass”、“pass1234”等。

【问题讨论】:

    标签: c# regex asp.net-mvc


    【解决方案1】:

    如果您真的不想要连续增加或减少的数字,我会在不使用正则表达式的情况下这样做。

    private static bool NoConsecutiveIncreasingOrDecreasingNumbers(string str)
    {
        if (string.IsNullOrWhiteSpace(str))
            return true;
    
        char prev = str[0];
        for (int i = 1; i < str.Length; i++)
        {
            char current = str[i];
            if ('0' < current && current < '9' && 
                '0' < prev && prev < '9' && 
                (prev + 1 == current || current + 1 == prev ))
                return false;
            prev = current;
        }
    
        return true;
    }
    

    如果您确实是指任何连续数字,请删除 if 中的最后一个条件。

    【讨论】:

    • 所有其他规则都是使用正则表达式定义的。
    • @Siddharth 您始终可以使用正则表达式进行一次检查,然后使用正则代码进行另一次检查。恕我直言,尝试创建一个怪物正则表达式很难维护。
    【解决方案2】:

    这是一个正则表达式,用于检测是升序还是降序。

    ^((?:0(?=1|$))?(?:1(?=2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5(?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9?|(?:9(?=8|$))?(?:8(?=7|$))?(?:7(?=6|$))?(?:6(?=5|$))?(?:5(?=4|$))?(?:4(?=3|$))?(?:3(?=2|$))?(?:2(?=1|$))?(?:1(?=0|$))?0?)$
    

    Debuggex Demo

    【讨论】:

    • 上述正则表达式将如何处理密码,即如果字符串包含数字以外的字符,例如。 pass1234
    • @Siddharth 如果去掉开头的 ^,数字前面可以有字符,如果去掉末尾的 $,数字后面可以有字符。
    • @Siddharth 如果此答案对您有所帮助,请将您的问题标记为已回答:)
    • 当我尝试使用以下语句获取结果时 var match = Regex.Match(password, @"((?:0(?=1|$))?(?:1(? =2|$))?(?:2(?=3|$))?(?:3(?=4|$))?(?:4(?=5|$))?(?:5 (?=6|$))?(?:6(?=7|$))?(?:7(?=8|$))?(?:8(?=9|$))?9? |(?:9(?=8|$))?(?:8(?=7|$))?(?:7(?=6|$))?(?:6(?=5|$ ))?(?:5(?=4|$))?(?:4(?=3|$))?(?:3(?=2|$))?(?:2(?=1 |$))?(?:1(?=0|$))?0?)");没有给出正确的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多