仅用于字母数字的正则表达式不起作用

Posted

技术标签:

【中文标题】仅用于字母数字的正则表达式不起作用【英文标题】:regex for alphanumeric only is not working 【发布时间】:2016-05-24 15:34:10 【问题描述】:

这是我正在尝试的代码:

string MatchNumberPattern = "^[a-zA-Z0-9]*$";

if (!Regex.IsMatch(cueTextBox9.Text, MatchNumberPattern))

    MessageBox.Show("Enter 8 Space Alphanumeric BT ID only");
    cueTextBox9.Text = String.Empty;

else

    do something();

它接受aaaaaaaa,但我想要字母和数字的组合,例如aaaa1234

【问题讨论】:

当然,它采用aaaaaaaa,您指定它采用任意次数的 a-z 或 A-Z 或 0-9 的任何内容。所以它也需要aaabbbjfgkgAJFFJL0142342。你想干什么?如果您只想匹配数字:^[0-9]*$^[0-9]+$ 如果空字符串不行。您可以使用\d 代替[0-9] 作为简写,但首先请说明您想要什么:) 我只想接受字母数字,而不是仅接受字母或仅接受数字.. 字母数字的意思是“字母数字是字母和数字字符的组合......”(引用自维基),所以它表示字母和数字。这就是你已经在这里做的事情了。 老兄,我是说我想要字母和数字都在其中...都在一个字符串中,那么它将是可以接受的。否则不是 供将来参考:“我希望我的正则表达式只匹配同时包含字母和数字的输入”。并且不要“花花公子”我。 【参考方案1】:

要在输入中同时出现字母和数字,您需要正向前瞻

@"^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]*$"
    ^^^^^^^^^^^^^^^^^^^^^^^^

见regex demo

(?=.*[a-zA-Z]) 确保输入字符串中有一个字母,(?=.*[0-9]) 确保输入字符串中有一个数字。

由于您从单行文本框中获取输入,因此在前瞻中使用. 是安全的。作为替代方案,您可以使用@"^(?=[^a-zA-Z]*[a-zA-Z])(?=[^0-9]*[0-9])[a-zA-Z0-9]*$"(基于对比原理)。

【讨论】:

【参考方案2】:

您可以使用lookahead 来检查一个数字并在其余部分之前匹配一个字母。

^(?i)(?=\D*\d)\d*[A-Z][A-Z\d]*$
^ 字符串开头 (?i) flag 用于无大小写匹配 (?=\D*\d) 提前查看\D* 任意数量的非数字,后跟\d 数字 如果成功匹配 \d*[A-Z] 任意数量的数字后跟 alpha [A-Z\d]* 匹配任意数量的字母数字字符,直到 $ 字符串结束

See demo at regex101

【讨论】:

【参考方案3】:
  async Task<string> CheckPasswordAgainstPasswordSettings(string password)
        
            Regex rxUpper= new Regex(@"[A-Z]");
            Regex rxLower = new Regex(@"[a-z]");



            var passwordcomplexityrulesetttings=  (await _PasswordComplexityRuleService.All()).First();
          if(passwordcomplexityrulesetttings==null)
            
                return "password valid";
            
          if(passwordcomplexityrulesetttings.MinLength> password.Length)
            
                return "password is not of minimum length";

            
            if (passwordcomplexityrulesetttings.MustContainLettersNumbers)
            
                if(password.Any(a=>!char.IsDigit(a)&&!char.IsLetter(a)) && !passwordcomplexityrulesetttings.MustContainSpecialCharacters)
                
                
                    return "password must contain letters and numbers";
                


            

            if (passwordcomplexityrulesetttings.MustContainSpecialCharacters)
            

                if (!password.Any(a => !char.IsDigit(a) && !char.IsLetter(a)))

                
                    return "password must contain special characters";
                


            
            if (passwordcomplexityrulesetttings.MustContainUpperLower)
            

                if (!rxLower.Match(password).Success||!rxUpper.Match(password).Success)

                
                    return "password must contain upper and lower case";
                


            
            
            return "password valid";

        

【讨论】:

以上是关于仅用于字母数字的正则表达式不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我的正则表达式在 C# 中不起作用

用于文本框验证的 HTML5 正则表达式模式:仅允许字母、空格和某些字符

用于密码验证的正则表达式,仅特定字符 [重复]

将字母和数字匹配在一起或仅匹配字母的正则表达式

Laravel - 使用正则表达式仅验证字母、数字和空格

正则表达式仅查找数字+文本的字母数字组合,无特殊