逆向工程JavaScript RegExp

时间:2014-01-27 00:13:23

标签: javascript regex

采用一个javascript类,其中有很多代码示例,但没有大量解释它是如何工作的。我思考我对各种操作符和标准函数有了深刻的理解,但下面的else if语句让我感到难以置信。有人可以请一点点,谢谢。

function validatePassword(password) {
 try {
   if (document.forms[0].password.value != document.forms[0].password_confirm.value)
     throw "You did not enter the same password.";
   else if (!/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/.test(password))
     throw "You did not enter a valid password.";
 }

具体来说: (!/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/.test(password))

2 个答案:

答案 0 :(得分:2)

分解

!/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/.test(password)

/.../.test(password)正在检查password的字符串值是否与左侧的regular expression匹配。

.{6,15}要求password长度介于6到15个UTF-16代码单元之间,并且只包含非换行符。

(?=.*\d)lookahead,仅在字符串中有数字时匹配。 .*\d表示任意行字符(*)的0或更多(.),后跟数字\d

(?=.*[a-z])(?=.*[A-Z])同样需要至少一个小写ASCII字母和一个大写字母。

答案 1 :(得分:2)

这是一个正则表达式(正则表达式)。字符:

  • (打开paren,这里没什么大不了的。
  • !“不是”操作员,否定接下来的内容。
  • /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/大讨厌的正则表达式。进一步打破这一部分(忽略斜线,因为它们只是分隔符):

      
        
    • ^必须匹配给定字符串的开头。
    •   
    • (?=.*\d)向前看;检查零个或多个字符然后检查一个数字。基本上,确保密码至少有一位数。
    •   
    • (?=.*[a-z])另一个先行;检查零个或多个字符,然后检查小写字母,确保密码至少包含一个小写字母。
    •   
    • (?=.*[A-Z])第三个先行;这个确保密码至少包含一个大写字母。
    •   
    • .{6,15}$匹配6到15次之间的任何字符,然后匹配字符串的结尾。由于我们自开始锚点(^)以来所做的一切都是先行,因此实际上还没有消耗任何字符。如果我们不需要确认上/下/数字,我们可以写^.{6,15}$,它将匹配长度为6到15个字符的任何字符串(包括)。
    •   
  • .test(password)之前的混乱创建了一个RegExp对象。现在我们调用test()方法,传入我们的密码。如果正则表达式匹配(即密码符合我们的要求),则返回true;如果密码失败,则返回false
  • )关闭paren。简单但重要。