正则表达式用于包含字母数字的字符串,其首字母必须为字母,并且至少包含一个字母和一个数字。
正则表达式用于包含字母数字的字符串,其首字母必须为字母,并且至少包含一个字母和一个数字。
我正在尝试生成一个满足以下条件的正则表达式:
- 它只能包含字母和数字。
- 它必须至少包含1个字母和1个数字。
- 它只能允许小写字母。
- 它的长度必须在3到16之间(包括3和16)。
- 第一个字符必须是字母。
例如:
- abc - 无效(还应包含至少1个数字)
- ab9 - 有效
- 9ab - 无效(应以字母开头)
- Ab9 - 无效(不允许大写字母)
- aa - 无效(长度至少为3)
- abcdefghijklmnop99 - 无效(长度至少为16)
我尝试了以下解决方案,但结果不如预期:
/^(?=.*[a-z])[a-z0-9]{3,16}$/
我想在ng-pattern中使用这个正则表达式来检查用户输入的文本。
问题的出现原因:
在某些情况下,我们需要验证一个字符串是否满足以下条件:以字母开头,包含至少一个字母和一个数字,可以是大小写字母和数字的组合,长度在2到15之间。这种需求可能是为了保证密码的复杂性或者验证用户输入的有效性。
解决方法:
为了满足上述条件,我们可以使用正则表达式来进行验证。下面是两个可行的正则表达式:
1. /^[a-z](?=.*\d)[a-z\d]{2,15}$/
这个正则表达式使用了以下几个元素:
- ^[a-z]:以小写字母开头
- (?=.*\d):包含至少一个数字
- [a-z\d]{2,15}:可以是小写字母、数字的组合,且长度在2到15之间
2. /^\p{Ll}(?=.*\p{N})[\p{Ll}\p{N}]{2,15}$/
这个正则表达式与第一个正则表达式基本相同,但是使用了Unicode字符类来支持更广泛的字符范围。
以上是解决该问题的两种正则表达式方法,可以根据具体需求选择其中之一来进行验证。
问题的出现原因是:提问者最初以为只能使用正则表达式来解决问题,因此提到了“Regular Expression”,但实际上,并不一定非要使用正则表达式来解决该问题。
解决方法是:可以使用JavaScript来编写多个小的函数来分别判断字符串是否满足各个条件,并将这些函数组合起来,形成一个大的函数来判断整个字符串是否满足所有条件。这样做的好处是可以更好地维护和修改代码,并且可以处理异步检查的情况。
以下是整理后的
我猜你可能误述了你的问题,并不是
“Regular Expression for alphanumeric with first alphabet and at least one alphabet and one number”
而是
“Way to test a string for alphanumeric with first alphabet and at least one alphabet and one number”,
并且你之所以提到正则表达式,可能只是因为你想象中这个问题一定要使用正则表达式来解决,但实际上并不是这样。
你可以编写一个大的正则表达式来解决这个问题,尽管另一个在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.every(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.every(Boolean)); }) . catch(function() { console.log("Execution of rule failed"); }); }
我上次查过,正则表达式无法处理异步检查。
我之所以想在ng-pattern中使用正则表达式(我之前肯定在原问题中提到了它,以求简洁),因此寻求帮助。不管怎样,感谢你宝贵的努力。