我正在研究一个javascript正则表达式,我打算与jquery validate插件一起使用(我将把它作为一个额外的方法添加)。它必须(以及其他规则):
测试是否输入了以下至少一个特殊字符:
!, ", #, $, %, &, ', (, ), *, +,-, .,/, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, ~
不允许连续3个相同的字符:
通过:
aa
99
++
未通过:
aaa
999
+++
我的正则表达式的问题是这些提到的规则有问题: 我认为这个问题与逃避有关,我试图逃避+和 - 无济于事。谁能帮忙!这是我的正则表达式:http://regexr.com/3ack3
答案 0 :(得分:2)
这是通过使用多个正则表达式来真正简化生活的那些要求之一,而不是试图将所有逻辑塞进一个带有许多断言的复杂正则表达式中。以下是一些实现您需求的JavaScript:
var specialCharRegex = /[!"#$%&'()*+.\/:;<=>?@\[\\\]^_`{|}~-]/;
var threeConsecutiveRegex = /(.)\1\1/;
var input = prompt();
if (specialCharRegex.test(input) && !threeConsecutiveRegex.test(input)) {
alert('passed');
} else {
alert('failed');
} // end if
关于棘手问题的一些注意事项:
/[\]
。 (正斜杠,因为它分隔正则表达式,反斜杠,因为它是转义字符,括号因为它们分隔括号表达式。)这种模块化方法也有利于可维护性,因为您可以在以后更轻松地进行更改(修改/添加/删除正则表达式,或更改if-test逻辑)。
另一个好处是您可以独立测试每个正则表达式,这可以让您向用户提供更准确的错误消息,而不是仅仅说“无效密码”。
修改:以下是如何将输入中接受的字符列入白名单:
var specialCharRegex = /[!"#$%&'()*+.\/:;<=>?@\[\\\]^_`{|}~-]/;
var threeConsecutiveRegex = /(.)\1\1/;
var nonWhitelistCharRegex = /[^a-zA-Z0-9!"#$%&'()*+.\/:;<=>?@\[\\\]^_`{|}~-]/;
var input = prompt();
if (specialCharRegex.test(input) && !threeConsecutiveRegex.test(input) && !nonWhitelistCharRegex.test(input)) {
alert('passed');
} else {
alert('failed');
} // end if
答案 1 :(得分:0)
您可以使用此正则表达式:
^(?!.*?(.)\1{2})(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[!@#$%^&*()_=\[\]{};':"\\|,.<>\/?+-]).{8,20}$
您可以使用以下方法缩短它:
^(?!.*?(.)\1{2})(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[\W_]).{8,20}$
即。使用非单词属性\W
而不是列出每个特殊字符。
答案 2 :(得分:0)
^(?=.*[!"#$%&'()*+,,\/:;<=>?@\[\]^_`{|}~-])(?!.*(.)\1\1).*$
试试这个。看看演示。
https://regex101.com/r/wX9fR1/10
您需要positive lookahead
来检查special characters
。
和
negative lookahead
来检查某个字符是否在3
次。