字符串的正则表达式,必须包含最少14个字符,其中至少2个是数字,最少6个是字母

Chr*_*ris 5 javascript php regex

我需要一个用于测试字符串的正则表达式

  • 至少14个字符 - 有效 A-Za-z0-9#,.-_
  • 14中最少6个字母
  • 14中至少有2个数字

有没有办法可以将它包装在一个正则表达式中(目前我有一个javascript和php函数可以完成三个单独的测试,一个是总共14个,另一个是至少有两个数字,另一个是在至少6个字母.

所以以下内容是有效的:

  • blabla2bla2f54a(有效期>总共14个,至少6个字母,至少2个数字)
  • thisIsNotValidAtAll(无效,因为少于2个数字)

rid*_*ner 15

简单!首先让我们看一下PHP中的注释版本:

$re = '/# Match 14+ char password with min 2 digits and 6 letters.
    ^                       # Anchor to start of string.
    (?=(?:.*?[A-Za-z]){6})  # minimum of 6 letters.
    (?=(?:.*?[0-9]){2})     # minimum of 2 numbers.
    [A-Za-z0-9#,.\-_]{14,}  # Match minimum of 14 characters.
    $                       # Anchor to end of string.
    /x';
Run Code Online (Sandbox Code Playgroud)

这是JavaScript版本:

var re = /^(?=(?:.*?[A-Za-z]){6})(?=(?:.*?[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
Run Code Online (Sandbox Code Playgroud)

附录20121130:

我注意到这个答案最近得到了一个upvote.这使用了一个更过时的表达式,所以我觉得是时候用更好的表达来更新它...

更有效的表达方式:

通过完全摆脱点星并贪婪地应用更精确的表达式(一个否定的char类),可以得到更有效的解决方案:

$re = '/# Match 14+ char password with min 2 digits and 6 letters.
    ^                              # Anchor to start of string.
    (?=(?:[^A-Za-z]*[A-Za-z]){6})  # minimum of 6 letters.
    (?=(?:[^0-9]*[0-9]){2})        # minimum of 2 numbers.
    [A-Za-z0-9#,.\-_]{14,}         # Match minimum of 14 characters.
    $                              # Anchor to end of string.
    /x';
Run Code Online (Sandbox Code Playgroud)

这是新的JavaScript版本:

var re = /^(?=(?:[^A-Za-z]*[A-Za-z]){6})(?=(?:[^0-9]*[0-9]){2})[A-Za-z0-9#,.\-_]{14,}$/;
Run Code Online (Sandbox Code Playgroud)

编辑:添加#,.-_到有效字符列表.
编辑:将贪婪变为懒惰的星.
编辑20121130:添加了替代版本,将lazy-dot-star替换为更精确的表达式的更有效的贪婪应用程序.

  • @Cris:由于每个要求只是最低要求,一旦最小数量匹配,就不再需要匹配了(所以为什么要麻烦 - 只需要额外的不必要的工作). (2认同)

Ben*_*Ben 5

我会建议多次检查,为此写一个正则表达式会很难看.多次检查还可以让您了解未达到的标准.

$input = 'blabla2bla2f54a';
$errors=array();
if (!preg_match('/^[A-Za-z0-9#,.\-_]*$/', $input))
    $errors[] = 'Invalid characters';
if (strlen($input) < 14)
    $errors[] = 'Not long enough';
if (strlen(preg_replace('/[^0-9]/','',$input)) < 2)
    $errors[] = 'Not enough numbers';
if (strlen(preg_replace('/[^A-Za-z]/','',$input)) < 6)
    $errors[] = 'Not enough letters';

if (count($errors) > 0) //Didn't work
{
    echo implode($errors,'<BR/>');
}
Run Code Online (Sandbox Code Playgroud)