我了解到前瞻性正则表达式就像这个x(?=y)
并且意味着
仅当x后跟y时匹配x。
<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
我不知道现在发生了什么,我会再次学习前瞻,但欢迎任何进一步的答案,谢谢
答案 0 :(得分:2)
(?=模式)是regex lookahead。它是模式的零宽度,“真或假”部分,实际上并不“吃掉”任何字符,但必须匹配(为真)才能使表达式成功。所以,
(?=.*\d)
意味着“超前看.*\d
,这是'任何'(任何次数,贪婪),后跟一个数字”。由于.*
默认会占用所有字符,直到字符串结尾,显然\d
没有任何东西可以自己吃。 .*
一次性回溯或放弃一个角色,直到\d
匹配为止。由于*
表示“零或更多”,.*
会放弃已匹配的所有内容(如有必要),以使\d
匹配。因此,字符串中某处至少一位数就足以让模式匹配。