Javascript 无前向模式的向前看(?=模式)
我了解到lookahead正则表达式是这样的Javascript 无前向模式的向前看(?=模式),javascript,regex,lookahead,Javascript,Regex,Lookahead,我了解到lookahead正则表达式是这样的x(?=y)并且表示 仅当x后跟y时才匹配x 据报道。但是,我发现以下代码: 带有密码字段的表单,该字段必须包含至少一个数字的8个或更多字符,以及一个大小写字母: 密码: 为什么(?=.*\d)指示“字符串中至少出现一个数字”?三对括号与匹配的位置无关,因为当我看到这一点时,它应该是第一个或多个数字,后跟一个或多个小写字母,然后是一个或多个大写字母,然后是8个或多个字符,怎么了 经过一点搜索,似乎正则表达式在不同的语言中是不同的,这就是为什么 编辑:
x(?=y)
并且表示
仅当x后跟y时才匹配x
据报道。但是,我发现以下代码:
带有密码字段的表单,该字段必须包含至少一个数字的8个或更多字符,以及一个大小写字母:
密码:
为什么(?=.*\d)指示“字符串中至少出现一个数字”?三对括号与匹配的位置无关,因为当我看到这一点时,它应该是第一个或多个数字,后跟一个或多个小写字母,然后是一个或多个大写字母,然后是8个或多个字符,怎么了
经过一点搜索,似乎正则表达式在不同的语言中是不同的,这就是为什么
编辑:
我想你们不明白我的问题。我的意思是向前看类似于x(?=y),但是(?=.*\d)前面没有任何内容,那么要匹配什么呢?第二个问题,三个括号有特定的顺序,但是匹配的顺序不一定相同,因为/abc/匹配的是“abcdd”而不是“cbdda”——为什么顺序不重要
更新:
好吧,也许我对“展望”有一个误解,多亏了为这个问题更改我标题的人。因此,如果在以下情况下不再需要,这里是我的最终更新:
我的问题是,正如标题所说,一个前瞻(?=模式)可以省略前面的模式,那么当括号前面没有任何内容时,这意味着什么呢?我搜索了“向前看”,几乎所有的解释都有前面的模式
我在regex tester上尝试了一些东西:
/(?=\d)/如果字符串包含数字(如“a2”),则会创建无限匹配,但如果字符串没有数字(如“a”),则会显示“不匹配”
有趣的是,/(?=\d)。/将匹配任何数字,现在它似乎等于\d
我不知道现在发生了什么,我将再次学习“前瞻”,但欢迎进一步回答,谢谢(=模式)是一个很好的例子。它是模式的零宽度、“真或假”部分,实际上不会“吃掉”任何字符,但必须匹配(为真)表达式才能成功。所以
(?=.*\d)
表示“向前看以查看”*\d
,即“任何东西”(任意次数,贪婪),后跟一个数字”。由于默认情况下,*
将吃掉所有字符,直到字符串结束,因此显然,\d
将没有任何东西可以自己吃掉。*
一次回溯或放弃一个字符,直到\d
匹配为止。由于*
表示“零或更多”,因此*
将放弃它匹配的所有内容,如果需要,让\d
匹配。因此,字符串中至少有一个数字足以让模式匹配。(?=模式)是一个数字。它是模式的零宽度、“真或假”部分,实际上不会“吃掉”任何字符,但必须匹配(为真)表达式才能成功。所以
(?=.*\d)
表示“向前看以查看”
*\d
,即“任何东西”(任意次数,贪婪),后跟一个数字”。由于默认情况下,*
将吃掉所有字符,直到字符串结束,因此显然,\d
将没有任何东西可以自己吃掉。*
一次回溯或放弃一个字符,直到\d
匹配为止。由于*
表示“零或更多”,因此*
将放弃它匹配的所有内容,如果需要,让\d
匹配。因此,字符串中至少有一个数字就足以让模式匹配。“为什么顺序不重要”——因为前瞻不会消耗输入。这基本上就是我回答的要点…@Drake:*
尽可能多地匹配零个或更多字符,而不是换行符。因此,(?=.*)
向前看只检查当前行上是否还有其他地方。如果存在该模式,则返回“true”,引擎将进一步搜索或返回有效匹配。清楚吗?默认情况下,模式
属性值被锚定,^(?:
被添加到开头,而)$
被添加到结尾。因此,lookaheads实际上是在开始位置匹配后一个接一个地执行的。请参见此类lookaheads的工作原理:区别在于lookaround实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不使用字符串中的字符,而只声明匹配是否可能。@WiktorStribiżew非常感谢您的详细解释,我从regular-expressions.info阅读了这篇文章,我确实从您引用的行中得到了一些线索。我现在必须睡觉了,希望明天我的头脑会更清晰,再次感谢,晚安“为什么订单不重要”——因为前瞻不会消耗输入。这基本上就是我回答的要点…@Drake:*
尽可能多地匹配零个或更多字符,而不是换行符。因此,(?=.*)
向前看只检查当前行上是否还有其他地方。如果存在该模式,则返回“true”,引擎将进一步搜索或返回有效匹配。清楚吗?默认情况下,模式
属性值被锚定,^(?:
被添加到开头,而)$
被添加到结尾。因此,lookaheads实际上是在开始位置匹配后一个接一个地执行的。请参见此类lookaheads的工作原理:区别在于lookaround实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不使用字符串中的字符,只声明匹配是否可能。@WiktorStribiżew非常感谢您的详细解释