我在regex完全是新的。我觉得很混乱。我需要一个密码的组合,必须以字母开头,必须包含字母和数字的组合。总长度应在6-10之间。尝试在客户端js和服务器端php中进行密码验证。
^[A-Za-z]+(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,9}$由于某种原因,总长度正在被添加6+9。它没有按照它应该的方式工作。
发布于 2019-09-11 20:53:49
模式的开始使用字符类的量词,并将首先匹配1+乘以[a-zA-Z]在这些匹配之后,查找断言开始,以便匹配可以超过6-10个字符。
在您的模式中,您使用点.{6,9},它将匹配除换行符以外的任何字符,并且不限于字符a和数字。
您能做的是在开始时匹配一次[A-Za-z],然后是5-9次[A-Za-z0-9]。
断言发生在第一个字符之后,因此在匹配[A-Za-z]之后,应该至少有一个大写字母and和一个数字表示。
^[A-Za-z](?=[^\d]*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])[A-Za-z0-9]{5,9}$^开始[A-Za-z]匹配大写或小写a-z(?=[^\d]*\d)断言一个数字(?=[^a-z]*[a-z])断言a-z(?=[^A-Z]*[A-Z])断言A[A-Za-z0-9]{5,9}匹配列表中的任何5-9次$末端
let pattern = /^[A-Za-z](?=[^\d]*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])[A-Za-z0-9]{5,9}$/;
[
"aA4aaaaaaa",
"aA4a",
"aA4aa",
"aA4aaa",
"aaaaaaa",
"AAaaaaaa",
"Pokemon12",
"PokeMon12"
].forEach(s => console.log(s + " --> " + pattern.test(s)));
正如Casimir et Hippolyte在注释中指出的那样,如果您希望允许一个小写或大写字符,您可以从断言开始,然后匹配字符类[a-zA-Z]。对于php版本,使用\D修饰符。
^(?=[^\d]*\d)(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])[A-Za-z][A-Za-z0-9]{5,9}$发布于 2019-09-11 20:44:56
编辑:我想我可能误解了你所说的“字母和数字的组合”。无论如何,只需减少第二个模式的值,因为第一个模式“吞噬”了其中的一个字符。
如果你这样想的话--它必须从一个字母开始,然后包含5-9个字母/数字,这可能会更容易一些。因此,类似于^[a-zA-Z][a-zA-Z0-9]{5,9}$ --这是一个非常糟糕的密码要求。没有理由将特殊字符排除在外,您不应该只使用10个字符。我更喜欢完全转储这种任意的需求,而使用像兹克本这样的熵强度检查器。
https://stackoverflow.com/questions/57896508
复制相似问题