Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无前向模式的向前看(?=模式)_Javascript_Regex_Lookahead - Fatal编程技术网

Javascript 无前向模式的向前看(?=模式)

Javascript 无前向模式的向前看(?=模式),javascript,regex,lookahead,Javascript,Regex,Lookahead,我了解到lookahead正则表达式是这样的x(?=y)并且表示 仅当x后跟y时才匹配x 据报道。但是,我发现以下代码: 带有密码字段的表单,该字段必须包含至少一个数字的8个或更多字符,以及一个大小写字母: 密码: 为什么(?=.*\d)指示“字符串中至少出现一个数字”?三对括号与匹配的位置无关,因为当我看到这一点时,它应该是第一个或多个数字,后跟一个或多个小写字母,然后是一个或多个大写字母,然后是8个或多个字符,怎么了 经过一点搜索,似乎正则表达式在不同的语言中是不同的,这就是为什么 编辑:

我了解到lookahead正则表达式是这样的
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非常感谢您的详细解释