C# 正则表达式在C代码中匹配,但在Jquery(MVC)中不匹配

C# 正则表达式在C代码中匹配,但在Jquery(MVC)中不匹配,c#,jquery,regex,asp.net-mvc,C#,Jquery,Regex,Asp.net Mvc,我的web应用程序将在注册表上生成密码。 但用户可以根据需要更改密码 当用户输入密码时,必须遵循我们的密码策略 我们的密码政策是: 密码长度必须大于或等于8 密码必须包含一个或多个大写字符 密码必须包含一个或多个小写字符 密码必须包含一个或多个数值 密码必须包含一个或多个特殊字符 正则表达式是(?=^.{8,}$)(?=.\d)(?=.!@$%^&]+(?![.\n])(?=[A-Z])(?=[A-Z])$ 这是我生成密码的C#代码: Regex passPattern = new Regex(

我的web应用程序将在注册表上生成密码。 但用户可以根据需要更改密码

当用户输入密码时,必须遵循我们的密码策略

我们的密码政策是:

  • 密码长度必须大于或等于8
  • 密码必须包含一个或多个大写字符
  • 密码必须包含一个或多个小写字符
  • 密码必须包含一个或多个数值
  • 密码必须包含一个或多个特殊字符
  • 正则表达式是(?=^.{8,}$)(?=.\d)(?=.!@$%^&]+(?![.\n])(?=[A-Z])(?=[A-Z])$

    这是我生成密码的C#代码:

    Regex passPattern = new Regex("(?=^.{8,}$)(?=.*\\d)(?=.*[!@#$%^&*]+)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$");
    
        var password = System.Web.Security.Membership.GeneratePassword(10,2);
    
        while (true)
        {
        if (!passPattern.IsMatch(password))
           {
             password = System.Web.Security.Membership.GeneratePassword(10, 2);                                   
           }
           else
           {
            break;
           }    
        }
    
    它将循环并不断生成密码,直到匹配为止

    在表单上,我还使用Jquery验证密码策略。下面是代码片段:

    <script type="text/javascript">
    
    $('#newPassword').keyup(function(e) {
        var strongRegex = new RegExp("(?=^.{8,}$)(?=.*\d)(?=.*[!@@#$%^&*]+)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$", "g");       
        var enoughRegex = new RegExp("(?=.{8,}).*", "g");
    
    
        if (false == enoughRegex.test($(this).val())) {
            $('#passstrength').html('More Characters');
        }
        else if (strongRegex.test($(this).val())== true) {          
            $('#passstrength').html('Meet Our Password Policy!');
        }
        else {      
            $('#passstrength').html('Please insert strength password!');
        }
    
        return true;
    });
    
    
    $('#newPassword').keyup(函数(e){
    var strongRegex=newregexp((?=^.{8,}$)(?=.*\d)(?=.[!@@$%^&*]+)(?![.\n])(?=.[A-Z])(?=.[A-Z])。*$,“g”);
    var-enoughRegex=newregexp((?=。{8,})。*,“g”);
    if(false==enoughRegex.test($(this.val())){
    $('#passstrength').html('More Characters');
    }
    如果(strongRegex.test($(this.val())==true){
    $('#passstrength').html('符合我们的密码策略!');
    }
    否则{
    $('#passstrength').html('请插入强度密码!');
    }
    返回true;
    });
    

    因此,结果是:

  • A%rI_2{l#Y=不匹配
  • P@ssw0rd.123=匹配
  • 2@C*DjDQdJ=匹配
  • ex@#XcINQ0=不匹配
  • 如您所见,并非所有密码都匹配。所有这些值都已在regex101.com和regexpal.com上进行了测试,结果都是匹配的

    那么如何解决这个问题呢


    p/s:我在页面中使用了razor引擎,因此您可以在jquery中的正则表达式上看到双“@”。

    代码的问题是:

    • /g
      在regex中使用的修饰符,该修饰符后来用于
      RegExp#test()
      (请参阅)
    • 构造函数RegExp表示法中的单反斜杠速记字符类(请参阅)
    另外,请注意,检查字符串长度最好使用常规字符串长度检查方法:

    $('#newPassword').keyup(function(e) {
        var strongRegex = /^(?=.*\d)(?=.*[!@@#$%^&*]+)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).{8,}$/;       
        // Use the literal regex notation so as not to double escape \ symbols!  Else,
        // var strongRegex = RegExp("^(?=.*\\d)(?=.*[!@@#$%^&*]+)(?![.\n])(?=.*[A-Z])(?=.*[a-z]).{8,}$");
        if ($(this).val().length < 8) {   // no need in the enoughRegex
            $('#passstrength').html('More Characters');
        }
        else if (strongRegex.test($(this).val())) {          
            $('#passstrength').html('Meet Our Password Policy!');
        }
        else {      
            $('#passstrength').html('Please insert a strong password!');
        }
    
        return true;
    });
    
    $('#newPassword').keyup(函数(e){
    var strongRegex=/^(?=.*\d)(?=.[!@$%^&*])(?![..\n])(?=.[A-Z])(?=.[A-Z])。{8,}$/;
    //使用文字正则表达式表示法,以免将转义\符号加倍!否则,
    //var strongRegex=RegExp(“^(?=.*\\d)(?=.[!@$%^&*])(?![..\n])(?=.[A-Z])(?=.[A-Z])。{8,}$”;
    if($(this.val().length<8){//enoughRegex中不需要
    $('#passstrength').html('More Characters');
    }
    else if(strongRegex.test($(this.val()){
    $('#passstrength').html('符合我们的密码策略!');
    }
    否则{
    $('#passstrength').html('请插入强密码!');
    }
    返回true;
    });
    
    您至少犯了两个基本错误:1)永远不要将
    /g
    用于
    RegExp.test()
    和2)当模式已知时,不要使用构造函数表示法,使用文本regex表示法(或者必须使用双反斜杠)(即,使用
    var strongRegex=/^(?=.{8,}$)(?=.\d)(?=.[!@@#$%^+++)(?![.[.]n](?=.[a-Z])(?=.[a-Z]).*$/;
    )。与其使用
    var enoughRegex=new RegExp((?=.{8,}.*,“g”);
    ,您真的可以只检查密码长度。顺便说一句,为什么要使用
    (?![..\n])
    ?似乎没有任何要求不是以点或换行开始的。它真的需要是regex吗?没有它的话,实现和阅读会容易得多(还有更多关于密码无效原因的已知错误)为什么不使用
    [RegularExpression]
    属性应用于您的模型属性,这样您就可以在不使用任何此代码的情况下立即获得客户端和服务器端验证?@StephenMuecke:注意,服务器端和客户端的验证是不同的。顺便说一句,这也是一个好问题。我仍然不确定您想用
    (?![。\n])表达什么
    。现在,这意味着不能以点或换行符开头。忘了提及,我们的策略密码不允许在第一个字符上加点。只需按照我老板的指示。不知道为什么。顺便说一句,正在工作!