【发布时间】:2016-03-11 18:35:10
【问题描述】:
我了解到前瞻正则表达式是这样的 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”----为什么顺序不重要?
更新: 好的,可能我对前瞻有误解,感谢谁为这个问题更改了我的标题。因此,如果之后不再需要,这是我的最后更新:
我的问题就像标题所说的那样,前瞻(?=模式)可以省略前面的模式,那么括号前什么都没有是什么意思?我搜索了“前瞻”,几乎所有解释都带有前面的模式。
我在正则表达式测试器上尝试了一些东西: /(?=\d)/ 如果字符串包含数字,例如“a2”,将创建无限匹配,但如果字符串没有数字,则会显示“不匹配”,例如“a”
有趣的是 /(?=\d)./ 将匹配任何数字,现在它似乎等于 \d
我现在不知道发生了什么,我会再次学习前瞻,但欢迎任何进一步的答案,谢谢
【问题讨论】:
-
“为什么顺序不重要”——因为向前看不会消耗输入。这基本上是我回答的要点……
-
@Drake:
*尽可能多地匹配除换行符以外的零个或多个字符。因此,(?=.*<SOMEPATTERN>)前瞻只是检查当前行的某个位置是否存在。如果存在该模式,则返回“true”,引擎会进一步搜索或返回有效匹配。清楚吗? -
pattern属性值默认是anchored,^(?:加在开头,)$加在末尾。因此,前瞻实际上是在匹配开始位置后一一执行的。请参阅this post,了解此类先行是如何工作的。 -
One more explanation: 区别在于lookaround实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不消耗字符串中的字符,而只是断言匹配是否可能。.
-
@WiktorStribiżew 非常感谢您的详细解释,我从regular-expressions.info 阅读了这篇文章,并从您引用的行中得到了一些线索。我现在要睡觉了,希望明天我的头脑会更清醒,再次感谢,晚安
标签: javascript regex lookahead