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

时间:2015-03-21 05:29:54

标签: angularjs regex

我正在尝试生成一个能够满足以下条件的正则表达式:

  1. 它应该只是字母数字。
  2. 它应包含至少1个字母和至少1个数字。
  3. 它应该只允许小写字母。
  4. 长度应在3到16之间。
  5. 第一个字符应为字母。
  6. 例如:

    1. abc - 无效(至少应有1个号码)
    2. ab9 - 有效
    3. 9ab - 无效(应以字母开头)
    4. Ab9 - 无效(不允许使用大写字母)
    5. aa - 无效(长度应至少为3)
    6. abcdefghijklmnop99 - 无效(长度应至少为16)
    7. 我尝试了以下解决方案但是没有按预期工作

      /^(?=.*[a-z])[a-z0-9]{3,16}$/
      

      我想在ng-pattern中使用此正则表达式来检查用户的文本输入。

2 个答案:

答案 0 :(得分:3)

我认为你错了你的问题,而且它不是

  

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

但实际上

  

使用第一个字母和至少一个字母和一个数字

测试字符串的字母数字的方法

并且你只提到正则表达式,因为你只是想象必须是解决它的最好或唯一的方法。 它不是

你可以写一个大的正则表达式来完成这项工作 - 虽然另一个SO成员经常回答正则表达式问题并拥有高代表但是在他的第一个答案(自删除)后无法正确执行 - 但是请记住,你和#39; ll必须维护它并在规则改变时修改它。

有些情况下,必须是一个正则表达式。例如,您正在使用库,并且库仅采用正则表达式作为测试或匹配内容的方式。然而,情况并非如此,我怀疑它是否在这里。

编程的一个好基本规则就是写下规则。另一个好的基本规则是,在你把它们写下来后,你应该能够把它们读回来。因此,我们首先将您的问题写成:

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

然后我们可以将传递写为

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无法处理异步检查。

答案 1 :(得分:1)

我使用:

/^[a-z](?=.*\d)[a-z\d]{2,15}$/

或者,如果你想与unicode兼容:

/^\p{Ll}(?=.*\p{N})[\p{Ll}\p{N}]{2,15}$/