繁体   English   中英

反向工程JavaScript RegExp

[英]Reverse engineering a JavaScript RegExp

以一个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)(?=.*[az])(?=.*[AZ]).{6,15}$/.test(password))

分解

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

/.../.test(password)正在检查password的字符串值是否与左侧的正则表达式匹配。

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

(?=.*\\d)是仅在字符串中有数字时才匹配的前瞻 .*\\d表示任何行字符( . )的0或更多( * ),后跟数字\\d

(?=.*[az])(?=.*[AZ])同样至少需要一个小写ASCII字母和一个大写字母。

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

  • (打开括号,这里没有什么棘手的问题。
  • ! “非”运算符,否定下一步。
  • /^(?=.*\\d)(?=.*[az])(?=.*[AZ]).{6,15}$/大讨厌的正则表达式。 进一步扩展此部分(忽略斜线,因为它们只是定界符):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM