我假设您错误地陈述了您的问题,而事实并非如此
第一个字母和至少一个字母和一个数字的字母数字的正则表达式
其实
用第一个字母和至少一个字母和一个数字测试字符串的方法
并且您只提到正则表达式是因为您只是认为必须是解决它的最佳或唯一方法。 不是。
您可以编写一个大的正则表达式来完成这项工作-尽管另一个定期回答正则表达式问题并具有较高代表的 SO 成员在他的第一个答案(因为已删除)时无法正确执行此操作-但请记住,您'必须维护它并在规则发生变化时对其进行修改。
在某些情况下,必须只是一个正则表达式。一个例子是你正在使用一个库,而这个库只使用一个正则表达式作为测试或匹配某些东西的方式。但是,这种情况并不常见,我也怀疑它是否在这里。
一个好的编程基本规则就是写下规则。另一个好的基本规则是,在你把它们写下来之后,你应该能够把它们读回来。因此,我们首先将您的问题写为:
function pass(str) {
return alphanumeric(str) &&
one_alphabet(str) &&
one_number (str) &&
right_length(str) &&
first_alpha (str);
}
一眼就能看出这是做什么的,而且它是正确的。你的老板甚至可能会想出来。像这样命名个别条件也构成了对我们自己和后来者的一种记录。
现在只需编写每个小函数,即使是具有基本正则表达式技能的人也可以做到:
function alphanumeric(str) { return !/[^a-z0-9]/.test(str); }
function one_alphabet(str) { return /a-z/ .test(str); }
function one_number (str) { return /\d/ .test(str); }
function first_alpha (str) { return /^[a-z]/ .test(str); }
function right_length(str) { var l = str.length; return l >=3 && l <= 16; }
实际上,如果first_alpha 通过,那么one_alphabet 也会通过,所以我们可以省略该测试。
如果你想变得花哨,你可以这样做:
var rules = [ alphanumeric, one_number, right_length, first_alpha];
function pass(str) {
return rules.all(function(rule) { return rule(str); });
}
现在添加新规则就像在 rules 数组中添加一个元素一样简单。
异步检查
以这种方式编写的许多优点之一是它可以轻松处理异步检查 - 假设您想检查以前没有使用过的密码,这需要往返服务器。所以我们写
var rules = [ alphanumeric, one_number, right_length, first_alpha, not_used];
function not_used(str) { return ajax(...); }
那么我们可以把pass写成
function pass(str) {
return Promise.all(rules.map(function(rule) { return rule(str); }) .
then (function(results) { console.log("Valid: ", results.all(Boolean)); }) .
catch(function() { console.log("Execution of rule failed"); });
}
我上次检查时,正则表达式无法处理异步检查。