JavaScript RegExp的逆向工程

JavaScript RegExp的逆向工程,javascript,regex,Javascript,Regex,以一个javascript类为例,其中有很多代码示例,但没有对其工作原理进行大量解释。我原以为自己对各种运算符和标准函数有着扎实的理解,但下面的else if语句让我难以置信。谁能帮我弄点光吗,谢谢 function validatePassword(password) { try { if (document.forms[0].password.value != document.forms[0].password_confirm.value) throw "You did

以一个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(密码))
故障

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

/…/.test(password)
正在检查
password
的字符串值是否与左边的匹配

{6,15}
要求
密码的长度在6到15个UTF-16代码单位之间,并且只包含非换行符

(?=.*\d)
是仅当字符串中有数字时才匹配的。
*\d
表示任何行字符(
)后跟数字
\d
的0个或多个(
*

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

分解

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

/…/.test(password)
正在检查
password
的字符串值是否与左边的匹配

{6,15}
要求
密码的长度在6到15个UTF-16代码单位之间,并且只包含非换行符

(?=.*\d)
是仅当字符串中有数字时才匹配的。
*\d
表示任何行字符(
)后跟数字
\d
的0个或多个(
*

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

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

  • 打开paren,这里没有什么棘手的问题
  • “Not”运算符,否定接下来的内容
  • /^(?=.*\d)(?=.[a-z])(?=.[a-z])。{6,15}$/
    更大的讨厌的正则表达式。进一步分解此部分(忽略斜杠,因为它们只是分隔符):

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

      • 打开paren,这里没有什么棘手的问题
      • “Not”运算符,否定接下来的内容
      • /^(?=.*\d)(?=.[a-z])(?=.[a-z])。{6,15}$/
        更大的讨厌的正则表达式。进一步分解此部分(忽略斜杠,因为它们只是分隔符):

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

      • 查看
        (!/^(?=.*\d)(?=.[a-z])(?=.[a-z])。{6,15}$/.test(password))
        是一个正则表达式()。密码需要匹配一系列筛选器才能被接受。各种字符是正则表达式和
        test()
        正在测试密码是否与正则表达式字符串匹配。第一条语句检查名为
        password
        的字段值是否与名为
        password\u confirm
        的字段值匹配,第二条语句检查密码是否包含一组有效字符。谢谢大家。这是非常有用的。看看
        (!/^(?=.*\d)(?=.[a-z])(?=.[a-z])。{6,15}$/.test(password))
        是一个正则表达式()。密码需要匹配一系列筛选器才能被接受。各种字符都是正则表达式