使用 javascript 进行密码验证
我需要使用 javascript 匹配密码字段,要求如下:
- 应为字母数字,且至少包含一个特殊字符。
- 不允许有空格
- 应至少为 10 个字符,最多为 20 个字符。
- 字符重复次数不得超过 2 次。
- ~,'.:;^| 不允许
我有一个正则表达式
var password = /^(?=.
[0-9])(?=.
[!@#$%^&
])[a-zA-Z0-9!@#$%^&
]{10,20}$/;
我该如何解决这个问题?
这可能是所需的正则表达式
^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[A-Za-z\d!@#$%^&|]{10,20}$
(?=.*[!@#$%^&])
确保列出的字符至少出现一次。
(?!.*(.).*\1.*\1)
确保没有字符重复超过两次。
[A-Za-z\d!@#$%^&|]{10,20
匹配字符类中 10-20 次出现的字符。
我会编写单独的规则(可能对所有规则都使用正则表达式 - 为了保持一致性 - 除非性能是一个很大的问题),每个规则都直接与您列表中的规则相关。
代码
var pw = "asddfak@kjg";
/* Should be alpha numaric with at least one special character. */
console.log(null !== pw.match(/[@+#$]/));
/* no spaces to be allowed */
console.log(null !== pw.match(/^\S+$/));
/* should be minimum 10 char and max 20 chars. */
console.log(null !== pw.match(/^.{10,20}$/));
/* No repeate of char more than 2 times. */
console.log(null === pw.match(/(.)(.*\1){2}/));
/* ~,'.:;^| are not allowed */
console.log(null !== pw.match(/^[^~,'.:;^|]+$/));
虽然可以使正则表达式更简洁,但我认为使规则更符合您的意图更易于维护。如果性能是一个重要的问题(通常不是这种事情),那么我会避免使用正则表达式,并使用字符串方法实现规则。
正则表达式解释
/ // start regex pattern
[ // open character class
@+#$ // match one of these `special` characters
] // close character class
/ // end regex pattern
/ // start regex pattern
^ // start matched string
\S+ // one or more (`+`) not spaces (`\S`)
$ // end matched string
/ // end regex pattern
/ // start regex pattern
^ // start matched string
.{10,20} // between 10 and 20 of any character (`.`)
$ // end matched string
/ // end regex pattern
/ // start regex pattern
(.) // any character captured as group 1
(.*\1){2} // followed by zero or more of anything (`\.*`) and then the captured group 1 (`\1`) two times (`{2}`)
/ // end regex pattern
/ // start regex pattern
^ // start matched string
[ // open character class
^~,'.:;^| // not (`^`) one of these characters
]+ // close character class
$ // end matched string
/ // end regex pattern
附言:您应该保留大量与您使用的正则表达式相关的注释,因为与书籍不同,它们写起来比读起来容易得多
这应该可以工作:
/^(?=.*?[!@#$%^&])(?:([a-zA-Z0-9!@#$%^&])(?!.*?\1.*?\1)){10,20}$/
(如果重复超过 2 次,则意味着同一个字符不能出现三次)
解释:
第一个条件
:一开始,我们会先遍历整个字符串,直到找到一个特殊字符,一旦找到,我们就停止,如果没有找到,则失败(
来源
):
(?=.*?[!@#$%^&])
第二个条件
:无事可做,
[a-zA-Z0-9!@#$%^&]
无论如何都不允许空格
第三个条件
:量词:
{10,20
第四个条件
:比较微妙:当我们遍历字符串时,对于捕获的每个字符,我们检查它是否没有重复两次(同一来源):
(?!.*?\1.*?\1)
第五个条件
:与空格相同