繁体   English   中英

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

[英]Regular Expression for alphanumeric with first alphabet and at least one alphabet and one number

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

  1. 它只能是字母数字。
  2. 它应包含至少1个字母和至少1个数字。
  3. 它应该只允许小写字母。
  4. 长度应在3到16之间(包括3和16)。
  5. 第一个字符应该是字母。

例如:

  1. abc-无效(还应该至少有1个数字)
  2. ab9-有效
  3. 9ab-无效(应以字母开头)
  4. Ab9-无效(不允许使用大写字母)
  5. aa-无效(长度至少应为3)
  6. abcdefghijklmnop99-无效(长度至少应为16)

我尝试了以下解决方案,但未按预期工作

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

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

我认为您错了问题了,那不是

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

但实际上

测试第一个字母,至少一个字母和一个数字的字母数字字符串的方法

并且您仅提及正则表达式,因为您只是想那一定是解决它的最佳或唯一方法。 不是

您可以编写一个能完成此工作的大正则表达式-尽管另一位定期回答regexp问题且具有较高代表声望的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(...); }

然后我们可以写通行证为

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

我会用:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM