c#Regex.Match与.Net Regex Tester结果不匹配

时间:2018-06-06 13:59:56

标签: c# regex

我需要限制用户使用至少8个字符的密码以及小写,大写,数字和特殊字符的混合。我已经使用.Net Regex Test网站进行测试,并得出以下解决方案。在下面的两个链接中,您可以看到mer220d#没有匹配,但Mer220d#完全匹配,但在我的.Net代码中,它使用完全相同的正则表达式,它们都返回true。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BOR.Security.CheckConstraints
{
    public class CheckPasswordConstraint
    { 

        public static bool passwordValidation(string passwordToCheck)
        {
            string pattern = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*\W)[a-zA-Z0-9\S]{8,}$";
            Match m = Regex.Match(passwordToCheck.TrimEnd(), pattern, RegexOptions.IgnoreCase);
            return m.Success;
        }
    }
}

你能告诉我我失踪了吗?

1 个答案:

答案 0 :(得分:1)

您应删除RegexOptions.IgnoreCase,因为(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z])相同,并且只需要1个ASCII字母(小写或大写)即可。

此外,[a-zA-Z0-9\S] = \S作为字母和数字都是非空格字符。

此外,您必须修剪字符串的两端,使用.Trim(),而不是.TrimEnd()

此外,建议在密码正则表达式中使用constrast的原理,以提高效率。

使用

字符串模式= @“ ^(?= [^ az] [az])(?= [^ AZ] [AZ])(?= \ D * \ d)(?= \ w * \ W)\ S {8,} $“;    匹配m = Regex.Match(passwordToCheck.Trim(),pattern);

说明

  • ^-字符串的开头
  • (?=[^a-z]*[a-z])-必须至少有1个小写ASCII字母
  • (?=[^A-Z]*[A-Z])-必须至少有1个大写ASCII字母
  • (?=\D*\d)-至少必须有1位数字
  • (?=\w*\W)-必须至少有1个非单词字符
  • \S{8,}-8个或更多非空格字符(无空格,但接受所有其他字符)
  • $-字符串的结尾。