我正在尝试生成一个能够满足以下条件的正则表达式:
例如:
我尝试了以下解决方案但是没有按预期工作
/^(?=.*[a-z])[a-z0-9]{3,16}$/
我想在ng-pattern中使用此正则表达式来检查用户的文本输入。
答案 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}$/