没有先前模式的前瞻(?=模式)

时间:2016-03-11 18:35:11

标签: javascript regex lookahead

我了解到前瞻性正则表达式就像这个x(?=y)并且意味着

  

仅当x后跟y时匹配x。

根据MDN。但是我在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)表示“字符串中至少出现一个数字”?并且三对括号在匹配的位置无关紧要,因为当我看这个时,它应该是一个或多个数字,后跟一个或多个小写字母,然后是一个或多个大写字母,然后是8个或更多字符,有什么不对?

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

修改 我不认为你们有我的问题。我的意思是前瞻就像x(?= y),但是(?=。* \ d)不会先于任何东西,那么匹配什么呢?第二个问题,三个括号带有特定的顺序,但匹配不必是相同的顺序,因为/ abc /匹配“abcdd”而不是“cbdda”----为什么顺序不重要?< / p>

更新 好吧,可能我对前瞻有误解,并且感谢无论谁改变了这个问题的头衔。所以这是我的最后更新,如果之后不再需要:

我的问题就像标题所说,前瞻(?=模式)可以省略前面的模式,那么在圆括号之前什么都没有呢?我搜索了“lookahead”,几乎所有的解释都带有前面的模式。

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

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

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

1 个答案:

答案 0 :(得分:2)

(?=模式)regex lookahead。它是模式的零宽度,“真或假”部分,实际上并不“吃掉”任何字符,但必须匹配(为真)才能使表达式成功。所以,

(?=.*\d)

意味着“超前看.*\d,这是'任何'(任何次数,贪婪),后跟一个数字”。由于.*默认会占用所有字符,直到字符串结尾,显然\d没有任何东西可以自己吃。 .*一次性回溯或放弃一个角色,直到\d匹配为止。由于*表示“零或更多”,.*会放弃已匹配的所有内容(如有必要),以使\d匹配。因此,字符串中某处至少一位数就足以让模式匹配。