我需要使用javascript匹配密码字段,并满足以下要求:
我有正则表达式 var password = /^(?=。 [0-9])(?=。 [!@# $ %^& ])[ - zA-Z0-9! #$%^&安培; ] {10,20} $ /; 我怎么能解决这个问题?
答案 0 :(得分:1)
这可能是必需的正则表达式
^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[A-Za-z\d!@#$%^&|]{10,20}$
(?=.*[!@#$%^&])
确保至少出现一次列出的字符。
(?!.*(.).*\1.*\1)
确保没有任何字符重复两次以上。
[A-Za-z\d!@#$%^&|]{10,20}
匹配字符类中10-20个字符。
答案 1 :(得分:1)
我会编写单独的规则(可能使用所有这些规则的正则表达式 - 为了保持一致性 - 除非性能是一个很大的问题),每个规则都直接与列表中的规则相关。
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
的 P.S。您应该使用正则表达式保留大量注释,因为与书籍不同,它们比阅读更容易编写
答案 2 :(得分:0)
这应该有效:
/^(?=.*?[!@#$%^&])(?:([a-zA-Z0-9!@#$%^&])(?!.*?\1.*?\1)){10,20}$/
(如果重复超过2次,则表示同一个角色不能出现三次)
<强>解释强>
第一个条件:在一开始,我们将第一次浏览整个字符串,直到找到一个特殊的字符,一旦我们拥有它,我们停止,如果我们不这样做,它失败(Source):(?=.*?[!@#$%^&])
第二个条件:无所事事,[a-zA-Z0-9!@#$%^&]
无论如何都不允许空格
第三个条件:量词:{10,20}
第四个条件:微妙的一个:当我们通过字符串时,对于捕获的每个字符,我们检查它不再重复两次(相同的来源):(?!.*?\1.*?\1)
第五个条件:与空格相同
答案 3 :(得分:0)
根据您要求中的5件事情,这是您需要的确切模式
^(?=.*[!@#$%^&])(?!.*(.).*\1.*\1)[^\s~,'.:;^|]{10,20}$