如何修改此正则表达式以仅允许字母和数字?
我认为,通过放置它必须至少有 2 个大写字母、小写字母和数字,它会将表达式限制为仅这些类型的字符。但它允许使用不需要的字符,例如波形符等。
/^[\s]*((?=([^\s]*\d){2,})(?=([^\s]*[a-z]){2,})(?=([^\s]*[A-Z]){2,})[^\s]{8,16})[\s]*$/
我没有看到单个正则表达式可以在其他小写字母和数字中计算大写字母的方法。正如他们所说,正则表达式不能算数。
因此,我认为您的解决方案将需要一个正则表达式来确定是否存在适当的字母种类,然后在单独的步骤中您可以计算大写字符:
/[A-Za-z0-9]{8,16}/
对于后续步骤(验证字符串是否至少包含两个大写字符、两个小写字母和两个数字),请尝试以下三个正则表达式:
/[A-Z].*[A-Z]/
/[0-9].*[0-9]/
/[a-z].*[a-z]/
任何与所有四个正则表达式匹配的字符串都将满足您的密码标准。
话虽这么说,在没有正则表达式的情况下创建一个函数并在循环中进行简单的字符计数可能会更容易。
FWIW,探索构建正则表达式的替代方法的一个好工具是访问 http://txt2re.com
这里有一种用几根针来完成的方法。 小提琴
alert( verify('AbcdeFghij123') );
alert( verify('Abcdeghij123') ); // Only 1 capital
alert( verify('AbcdeFghij') ); // No numbers
alert( verify('ABCDEF123') ); // No lowercase
alert( verify('Abc~~ghij123') ); // Tilde
alert( verify('') ); // Blank
function verify(pass) {
return /^[A-Za-z0-9]+$/.test(pass)
&& /[A-Z][^A-Z]*[A-Z]/.test(pass)
&& /[a-z][^a-z]*[a-z]/.test(pass)
&& /[0-9][^0-9]*[0-9]/.test(pass);
}
如果您想将尺寸限制在 X 和 Y 之间,请将
/^[A-Za-z0-9]+$/
替换为 /^[A-Za-z0-9]{X,Y}$/
。很简单吧?
这是一个经过测试的函数,可以根据您的要求验证密码:
/* Validate a password string that has:
* From 8 to 16 letters and digits.
* Optional leading and trailing whitespace.
* At least 2 uppercase letters.
* At least 2 lowercase letters.
* At least 2 decimal digits.
Here is the regex in (PHP) free-spacing mode with comments:
$re = '/# Validate password has 2 upper, 2 lower and 2 digits.
^ # Anchor to start of string.
(?=(?:[^A-Z]*[A-Z]){2}) # Assert 2 uppercase letters.
(?=(?:[^a-z]*[a-z]){2}) # Assert 2 lowercase letters.
(?=(?:[^0-9]*[0-9]){2}) # Assert 2 decimal digits.
\s* # Allow leading whitespace.
([A-Za-z0-9]{8,16}) # $1: Password 8-16 of [A-Za-z0-9]
\s* # Allow trailing whitespace.
$ # Anchor to end of string.
/x';
If valid password, return password trimmed of leading and trailing whitespace.
If invalid password, return empty string.
*/
function validatePassword(text) {
var re = /^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^a-z]*[a-z]){2})(?=(?:[^0-9]*[0-9]){2})\s*([A-Za-z0-9]{8,16})\s*$/;
var m = text.match(re);
if (m) return m[1]; // If valid, return trimmed password
return ''; // If not valid, return empty string
}
真的很简单。这就能达到目的。
/(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?=.*\d.*\d)[a-zA-Z0-9]{8,16}/
要求:最少 2 个数字、2 个小写字母、2 个大写字母。 8 及最大总共 16 个字符
回答解释...
// Matches/requires 2 lowercase (a-z)
(?=.*[a-z].*[a-z])
// Matches/requires 2 uppercase (A-Z)
(?=.*[A-Z].*[A-Z])
// Matches/requires 2 digits (0-9)
(?=.*\d.*\d)
// Matches/requires all 3 conditions and sets minimum string length of 8 and maximum string legth of 16
[a-zA-Z0-9]{8,16}