ASP.NET Core MVC中密码验证正则表达式失效问题
问题
我有一个正则表达式,原本用于匹配P@ssword1234这类符合规则的密码,之前在Angular中可以正常工作,但在ASP.NET Core MVC里无法匹配成功。
密码规则:
- 长度≥10个字符
- 至少包含1个数字
- 至少包含1个大写字母
- 至少包含1个小写字母
- 至少包含1个特殊字符
ASP.NET Core MVC中的验证代码:
[DisplayName("Password")] [Required(ErrorMessage = "Please enter your password.")] [DataType(DataType.Password)] [RegularExpression(@"^(?=.*[!@#$%^&*(),.?\"":{}|<>])(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d!@#$%^&*(),.?\"":{}|<>]{10,}$", ErrorMessage = "Password must contain at least 10 characters, including at least 1 uppercase letter, at least 1 lowercase letter, at least one number and a special character.")]
原因
问题出在C#逐字字符串(@前缀)的转义逻辑与JavaScript不同:在C#逐字字符串中,双引号需要用""转义,而不是\"。原正则里的\"会被解析为反斜杠+双引号两个独立字符,导致正则的特殊字符集合错误包含了反斜杠,同时没有正确识别双引号,进而引发匹配失败。
解决方案
将正则中的所有\"替换为"",修正后的代码如下:
[DisplayName("Password")] [Required(ErrorMessage = "Please enter your password.")] [DataType(DataType.Password)] [RegularExpression(@"^(?=.*[!@#$%^&*(),.?"":{}|<>])(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d!@#$%^&*(),.?"":{}|<>]{10,}$", ErrorMessage = "Password must contain at least 10 characters, including at least 1 uppercase letter, at least 1 lowercase letter, at least one number and a special character.")]
修正后,正则引擎会正确识别特殊字符集合中的双引号,不会引入多余的反斜杠,此时P@ssword1234这类符合规则的密码就能正常通过验证。
内容的提问来源于stack exchange,提问作者A.Mac
相关产品推荐
相关产品推荐

