【问题标题】:Regular Expression for alphanumeric with first alphabet and at least one alphabet and one number具有第一个字母和至少一个字母和一个数字的字母数字的正则表达式
【发布时间】:2015-05-24 15:12:07
【问题描述】:

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

  1. 它只能是字母数字。
  2. 应至少包含 1 个字母和至少 1 个数字。
  3. 它应该只允许小写字母。
  4. 长度应介于 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 中使用这个正则表达式来检查用户输入的文本。

【问题讨论】:

  • 您不需要正则表达式。只需检查您提到的条件。顺便说一句,Stack Overflow 上至少有十几个这样的问题。搜索它们。
  • @ torazaburo - 我在现有问题中搜索了答案。当找不到满意的答案时,创建了一个新问题。已经花了3-4个小时搞清楚。无法弄清楚如何执行数字。因此,决定发布具有完整要求的查询。
  • 那你一定见过这个:stackoverflow.com/questions/26322867/….

标签: angularjs regex


【解决方案1】:

我假设您错误地陈述了您的问题,而事实并非如此

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

其实

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

并且您只提到正则表达式是因为您只是认为必须是解决它的最佳或唯一方法。 不是。

您可以编写一个大的正则表达式来完成这项工作-尽管另一个定期回答正则表达式问题并具有较高代表的 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"); });
}

我上次检查时,正则表达式无法处理异步检查。

【讨论】:

  • 我想在 ng-pattern 中使用正则表达式(我必须将它包含在原始问题中,因为它很勇敢。)。因此,寻求帮助。否则,javascript 解决方案已经到位。无论如何感谢您的宝贵努力。
【解决方案2】:

我会使用:

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

或者,如果你想兼容 unicode:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2016-12-14
    • 2022-12-03
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多