链接JavaScript正则表达式中的多个正向超前

Ruc*_*rma 6 javascript regex string

我是学习正则表达式的新手,并且遇到了这个答案该答案使用正向前行验证密码。

正则表达式为- (/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/)用户提供的细分为-

(/^
(?=.*\d)                //should contain at least one digit
(?=.*[a-z])             //should contain at least one lower case
(?=.*[A-Z])             //should contain at least one upper case
[a-zA-Z0-9]{8,}         //should contain at least 8 from the mentioned characters
$/)
Run Code Online (Sandbox Code Playgroud)

但是,我不清楚将多个前瞻链接在一起。从我所学到的内容中,正面前瞻检查表达式是否跟随在前瞻中指定的内容。例如,这个答案说-

正则表达式is(?= all)与字母匹配is,但前提是字母后紧跟字母all

那么,我的问题是个人前瞻如何工作?如果我把它分解-

  1. 第一部分是^(?=.*\d)。这是否表明在字符串的开头查找零个或多个出现的任何字符,后跟1位数字(从而检查1位数字的存在)?
  2. 如果第一部分是正确的,那么在第二部分中(?=.*[a-z]),是否检查了字符串开头的第1步,是否发现零个或多个出现的任何字符,后跟一个小写字母?还是两个前瞻完全不相关?
  3. 另外,( )每个前瞻周围有什么用?是否创建捕获组?

我也看过有关Rexegg的文章,但并没有太大帮助。

将不胜感激。

Jan*_*Jan 2

正如评论中提到的,这里的关键点不是向前查找,而是回溯(?=.*\d)查找完整的行 ( .*),然后回溯以找到至少一个数字 ( \d)。


这在不同的前瞻中重复,并且可以像这样进行优化:

(/^
(?=\D*\d)                // should contain at least one digit
(?=[^a-z]*[a-z])         // should contain at least one lower case
(?=[^A-Z]*[A-Z])         // should contain at least one upper case
[a-zA-Z0-9]{8,}          // should contain at least 8 from the mentioned characters
$/)
Run Code Online (Sandbox Code Playgroud)

这里,应用了对比原理。