javascript - Lookahead (?=模式) 没有前面的模式

标签 javascript regex regex-lookarounds

我了解到lookahead正则表达式是这样的x(?=y)和意味着

Matches x only if x is followed by y.

根据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”----为什么顺序不重要?

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

我的问题就像标题所说的那样,lookahead (?=pattern) 可以省略前面的模式,那么括号前面没有任何内容是什么意思?我搜索了“lookahead”,几乎所有解释都带有前面的模式。

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

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

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

最佳答案

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

(?=.*\d)

表示“向前查看 .*\d,它是“任何内容”(任意次数,贪婪),后跟一个数字”。由于 .* 默认情况下会吃掉所有字符,直到字符串末尾,显然 \d 不会再有任何东西可以吃掉了。 .* 一次回溯或放弃一个字符,直到 \d 可以匹配。由于 * 表示“零个或多个”,因此 .* 将放弃其已匹配的所有内容(如有必要),以使 \d 匹配。因此,至少字符串中的某个数字足以让模式匹配。

关于javascript - Lookahead (?=模式) 没有前面的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35947498/

相关文章:

javascript - 如何停止视频播放,当 "scrolled bottom"呢?

php - 在 Galleriffic jQuery 插件中设置第一个选定的图像?

python - 用逗号匹配 float ,然后用点替换逗号?

javascript - 如何使用 Google 图表工具为 Y 轴创建具有两种不同比例的(条形)图表?

正则表达式验证

regex - 监听 bash 命令输出,当匹配字符串时,保存到文件并退出进程

python - 将字母和数字组合在一起作为序数

Python re.findall 仅返回第一个字符

c# - 复杂的正则表达式验证器

javascript - 显示/隐藏 jQuery,显示所有的 div 而不是被点击的