没有前导模式的先行 (?=pattern)

Lookahead (?=pattern) without preceding pattern

我了解到前瞻正则表达式是这样的 x(?=y) 意思是

Matches x only if x is followed by y.

根据MDN. However I find this code on w3school

<p>A form with a password field that must contain 8 or more characters that are of at least one number, and one uppercase and lowercase letter:</p>

<form action="demo_form.asp">
Password: <input type="password" name="pw" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" title="Must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters">
<input type="submit">
</form>

为什么(?=.*\d)表示"at least one number appears in the string"?三对括号与匹配的位置无关紧要,因为在我看来,它应该首先是一个或多个数字,然后是一个或多个小写字母,然后是一个或多个大写字母,然后是 8 个或更多字符,怎么了?

经过一番搜索,似乎正则表达式在各种语言中有所不同,这是关于什么的吗?

编辑: 我不认为你们明白我的问题。我的意思是前瞻类似于 x(?=y),但是 (?=.*\d) 前面没有任何内容,那么要匹配什么?第二个问题,三个括号有特定的顺序,但匹配不一定是相同的顺序,因为 /abc/ 匹配 "abcdd" 而不是 "cbdda" ---- 为什么不订单问题?

更新: 好吧,可能是我对前瞻有误解,感谢为这个问题更改标题的人。所以如果之后没有更多需要的话,这是我的最后更新:

我的问题如题所示,lookahead (?=pattern) 可以省略前面的pattern,那么括号前什么都没有是什么意思呢?我搜索了 'lookahead',几乎所有的解释都带有前面的模式。

我在正则表达式测试器上尝试了一些东西: /(?=\d)/ 如果字符串包含数字,如 "a2",将创建一个无限匹配,但如果字符串没有数字,它将显示 "no match",如 "a"

有趣的是 /(?=\d)./ 将匹配任何数字,现在它似乎等于 \d

我不知道现在发生了什么,我会去重新学习前瞻,但欢迎任何进一步的答案,谢谢

(?=pattern)regex lookahead。它是模式的零宽度 "true or false" 部分,实际上 "eat" 没有任何字符,但必须匹配(为真)表达式才能成功。所以,

(?=.*\d)

表示"lookahead to see .*\d, which is 'anything' (any number of times, greedy), followed by a number"。由于 .* 默认情况下会吃掉所有字符,直到字符串末尾,显然 \d 不会有任何东西可以吃掉。 .* 每次回溯或放弃一个字符,直到 \d 可以匹配。由于 * 表示 'zero or more',.* 将放弃它匹配的所有内容,如果有必要,让 \d 匹配。因此,至少字符串中某处的一个数字足以让模式匹配。