在JavaScript正则表达式中链接多个正向前瞻

时间:2017-11-05 11:20:20

标签: javascript regex string

我是学习正则表达式的新手,我遇到了this answer,它使用正向前瞻来验证密码。

正则表达式为 - (/^(?=.*\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
$/)

但是,我不太清楚将多个前瞻链接在一起。根据我所学到的,正向前瞻检查表达式是否后跟前瞻中指定的内容。例如,answer表示 -

  

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

所以,我的问题是个人前瞻是如何运作的?如果我把它分解 -

  1. 第一部分是^(?=.*\d)。这是否表示在字符串的开始处,查找是否出现任何字符的零次或多次,后跟1位数(从而检查是否存在1位数字)?
  2. 如果第一部分是正确的,那么使用第二部分(?=.*[a-z]),是否检查 检查字符串开头的第1步,查找零次或多次任何字符,后跟小写字母?或者两个先行者是否彼此完全无关?
  3. 此外,每个前瞻周围( )的用途是什么?它是否创建了捕获组?
  4. 我也看了Rexegg article的前瞻,但这没什么用。

    感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

正如评论中提到的,这里的关键点不是前瞻,而是回溯(?=.*\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
$/)

这里,对比原则适用。

答案 1 :(得分:0)

断言是具有单独上下文的原子独立表达式 从正则表达式的其余部分。

最好将其视为:它们存在于角色之间 是的,有这样一个地方。

虽然是独立的,但他们会收到当前的搜索位置,
然后他们开始穿过绳子试图匹配某些东西 他们从字面上推进了搜索位置的私人(本地)副本 去做这个。

他们返回真或假,取决于他们是否匹配某事 此断言的调用者维护它的自己的搜索位置副本。
因此,当断言返回时,呼叫者搜索位置没有改变。

因此,您可以在不必担心的情况下编织进出 搜索位置。

当嵌套断言时,你可以看到这一点:

目标1:Boy1 has a dog and a train
目标2:Boy2 has a dog

正则表达式:Boy\d(?= has a dog(?! and a train))

目标:找到与正则表达式匹配的 Boy#

关于断言的其他值得注意的事情:

它们是原子的(即:独立的),因为它们不受回溯影响 来自外部力量。

在内部,他们可以像其他任何地方一样回溯 但是,当涉及到它们的位置时,无法改变

此外,在内部断言中,可以像其他地方一样捕获。
示例^(?=.*\b(\w+)\b)捕获字符串中的最后一个单词,但搜索位置不会更改。

此外,断言就像一盏红灯。断言之后的直接表达 必须等到绿灯亮起。
这是断言传回的结果, true或false