正则表达式允许某些特殊字符 - 逃避问题

时间:2015-02-09 06:47:56

标签: javascript regex validation

我正在研究一个javascript正则表达式,我打算与jquery validate插件一起使用(我将把它作为一个额外的方法添加)。它必须(以及其他规则):

  1. 测试是否输入了以下至少一个特殊字符:

    !, ", #, $, %, &, ', (, ), *, +,-, .,/, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, ~
    
  2. 不允许连续3个相同的字符:

  3. 通过:

    aa
    99
    ++
    

    未通过:

    aaa
    999
    +++
    

    我的正则表达式的问题是这些提到的规则有问题: 我认为这个问题与逃避有关,我试图逃避+和 - 无济于事。谁能帮忙!这是我的正则表达式:http://regexr.com/3ack3

3 个答案:

答案 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

http://jsfiddle.net/t8609xv2/

关于棘手问题的一些注意事项:

  • 在括号表达式中,以下四个特殊字符必须使用反斜杠转义:/[\]。 (正斜杠,因为它分隔正则表达式,反斜杠,因为它是转义字符,括号因为它们分隔括号表达式。)
  • 在括号表达式中,必须将短划线移动到末尾,否则可能会指定字符范围。当它结束时,它从不指定范围,因此将它放在那里总是更安全。

这种模块化方法也有利于可维护性,因为您可以在以后更轻松地进行更改(修改/添加/删除正则表达式,或更改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

http://jsfiddle.net/t8609xv2/2/

答案 1 :(得分:0)

您可以使用此正则表达式:

^(?!.*?(.)\1{2})(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=\D*\d)(?=.*?[!@#$%^&*()_=\[\]{};':"\\|,.<>\/?+-]).{8,20}$

RegEx Demo

您可以使用以下方法缩短它:

^(?!.*?(.)\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次。