Regex允许某些特殊字符-转义问题

Regex to allow certain special characters - escape issue

本文关键字:转义 问题 特殊字符 许某些 Regex      更新时间:2023-09-26

我正在开发一个javascript正则表达式,我打算将其与jquery验证插件一起使用(我将添加它作为一个附加方法)。它必须(除其他规则外):

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

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

通过:

aa
99
++

未通过:

aaa
999
+++

我的正则表达式的问题是,它对以下提到的规则有问题:我认为这个问题与逃跑有关,我尝试过逃跑+和-,但都无济于事。有人能帮忙吗!这是我的正则表达式:http://regexr.com/3ack3

这是您可以通过使用多个正则表达式来真正简化生活的需求之一,而不是试图将所有逻辑塞进一个包含许多断言的复杂正则表达式中。以下是一些实现您需求的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测试逻辑)。

另一个好处是,您可以独立测试每个正则表达式,这可以让您向用户提供更准确的错误消息,而不是只说"无效密码"之类的话。

编辑:以下是如何将输入中接受的字符列入白名单:

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'1).*$

试试这个。请参阅演示。

https://regex101.com/r/wX9fR1/10

您需要一个positive lookahead来检查special characters

一个negative lookahead来检查一个字符是否在那里3次。

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

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

RegEx演示

您可以使用缩短它

^(?!.*?(.)'1{2})(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?='D*'d)(?=.*?['W_]).{8,20}$

即使用非字属性CCD_ 6而不是列出每个特殊字符。