当前位置: 首页 > 知识库问答 >
问题:

具有第一个字母和至少一个字母和一个数字的字母数字正则表达式

濮阳旺
2023-03-14
    null
    null
/^(?=.*[a-z])[a-z0-9]{3,16}$/

我想在ng-pattern中使用这个regex来检查来自用户的文本输入。

共有1个答案

唐兴发
2023-03-14

我想你说错了你的问题,但事实并非如此

具有第一个字母和最多一个字母和一个数字的alphnumeric的正则表达式

但实际上

function pass(str) {
    return alphanumeric(str) &&
           one_alphabet(str) &&
           one_number  (str) &&
           right_length(str) &&
           first_alpha (str);
}

人们一眼就能看出这是干什么的,而且是正确的。你的老板甚至可能会想出来。像这样命名个别条件也为我们自己和后来的人构成了一种文档。

现在只需编写每个小函数,即使是那些具有基本regexp技能的人也可以完成:

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); }); 
}

以这种方式编写东西的许多优点之一是它可以轻松地处理异步检查--假设您想检查密码以前是否使用过,这需要往返服务器。所以我们写

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"); });
}

上次检查时,Regexp无法处理异步检查。

 类似资料: