具有至少一个字母或至少一个数字的字母数字字符串的正则表达式

5
为了测试一个包含字母和数字的字符串,通常我们使用正则表达式"^\w+$"(对于C#最好使用此表达式)。但是这个正则表达式也会接受只包含数字或字母的字符串,例如"12345678""asdfgth"
我需要一个正则表达式,只接受包含至少一个字母和一个数字的字符串。也就是说,"ar56ji"将是正确的字符串之一,而不是上面提到的那些字符串。
谢谢。

你是否试图强制实施某种密码规则?如果是这样,请考虑不要这样做。 - Carl Norum
不,这不是为了任何密码匹配。我需要它用于一个字符串字段,该字段将在整个应用程序中唯一标识实体。由于它是由用户提供的,因此根据客户要求,我认为正则表达式是一个很好的选择。 - Arnab Das
http://www.rubular.com/r/wdmyC43XGq - brainless
5个回答

9
这应该可以解决问题:
if (Regex.IsMatch(subjectString, @"
    # Match string having one letter and one digit (min).
    \A                        # Anchor to start of string.
      (?=[^0-9]*[0-9])        # at least one number and
      (?=[^A-Za-z]*[A-Za-z])  # at least one letter.
      \w+                     # Match string of alphanums.
    \Z                        # Anchor to end of string.
    ",
    RegexOptions.IgnorePatternWhitespace)) {
    // Successful match
} else {
    // Match attempt failed
} 

编辑于2012年8月28日:通过将懒惰的点星替换为具体的贪婪字符类,提高了向前查看的效率。


1
非常有帮助和指导性 +1。谢谢您的发布。 - Trey Carroll
1
一个非常适合我的目的的正则表达式。我使用了一些修改过的版本:"^(?=.*?[0-9])(?=.*?[A-Za-z])[a-zA-Z0-9_]+$"。实际上,我将其作为一个简单的字符串处理,所以它会将\W解释为“无效的转义序列”。 谢谢。 - Arnab Das
ridgerunner: 很好。这个正则表达式能正常工作。如何在这个正则表达式中设置长度限制?假设字符串的长度必须恰好为8个字符。 - brainless
1
明白了。^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{8}$ 这个会检查是否至少有一个数字,至少一个大写字母和至少一个小写字母,并且还会检查长度。 - brainless

1

这个正则表达式也可以工作。但我认为没有必要在正则表达式的开头和结尾添加\W*。一个\W*在开头或结尾应该就足够了。 谢谢。 - Arnab Das

0

这应该可以工作:

"^[a-zA-Z0-9_]*([a-zA-Z][0-9]|[0-9][a-zA-Z])[a-zA-Z0-9_]*$"

这将匹配:

<zero-or-more-stuff>
EITHER <letter-followed-by-digit> OR <digit-followed-by-letter>
<zero-or-more-stuff>

通过确保您要么是一个数字后跟着字母,要么是一个字母后跟着数字,您正在强制要求至少有一个数字和至少有一个字母。请注意,我上面省略了下划线(_),因为不清楚您是否接受它作为一个字母、一个数字或者两者都不是。

1
字符串 pwd = "a1111111"; //应该通过但实际上没有。 - Trey Carroll

0

简单就是美。如果你在最初编写代码时遇到了困难,那么维护或修改它的人(或其他可怜的家伙)也会遇到困难。(而且我认为上面列出的方法可能存在一些潜在漏洞。)

using System.Text.RegularExpressions;

boolean IsGoodPassword(string pwd){
    int minPwdLen = 8;
    int maxPwdLen = 12;
    boolean allowableChars = false;
    boolean oneLetterOneNumber = false;
    boolean goodLength = false;

    string allowedCharsPattern = "^[a-z0-9]*$";

    //Does it pass the test for containing only allowed chars?
    allowableChars = Regex.IsMatch(pwd, allowedCharsPattern , RegexOptions.IgnoreCase));

    //Does it contain at least one # and one letter?
    oneLetterOneNumber = Regex.IsMatch(pwd, "[0-9]")) && Regex.IsMatch(pwd, "[a-z]", RegularExpressions.IgnoreCase));

    //Does it pass length requirements?
    goodLength = pwd.Length >= minPwdLength && pwd.Length <= maxPwdLength;

    return allowableChars && oneLetterOneNumber && goodLength;
}

我不会用这个来匹配任何好的密码。你的方法很好,但是它将花费很长时间调用服务器,然后在浏览器上给出错误。因此,在Silverlight页面中使用正则表达式并将其附加到控件本身上是一个好方法。这样做会更快,因为它将在客户端进行检查。无论如何,您看到了以上正则表达式中的漏洞吗?Ridgerunner提供了一个好的正则表达式。谢谢。 - Arnab Das

0

试试这个 ^([a-zA-z]+[0-9][a-zA-Z0-9]*)|([0-9]+[a-zA-z][a-zA-Z0-9]*)$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接