我正在学习关于 JavaScript 数据结构的 freecodecamp.org 课程,通过 RegExp 章节。然后我遇到了以下断言:
“正则表达式 Modelo
将检查密码是否包含 3 到 6 个字符和至少一个数字”。
(这里的“检查”意味着 CheckBox
返回 true)
这对我来说似乎很奇怪。首先,在 Stack Exchange 中环顾四周,我在 this 帖子中发现 A(?=B) 是正向前瞻的定义,并且没有提到 A(括号中的前面的表达式)是可选的。那么,freecodecamp 的例子不应该在第一次前瞻之前有一个表达式吗?
我相信这个另一个例子与前面提到的非常相似,但更简单,所以我会提到它,以防解释更简单:
为什么 /(?=\w{3,6})(?=\D*\d)/
在检查字符串“1”时返回 true?,它不应该查找字母数字字符后跟数字字符吗?
PS: 经过思考,我假设我的第一个示例独立检查两个前瞻模式(即首先检查字符串是否由三到六个字符组成,返回 true,然后检查是否存在是一个字母数字字符,最后因为两个搜索都返回真,整个正则表达式测试返回真)。但这似乎与我链接的帖子中提到的定义不一致。计算机“内部”是否有更通用的定义或算法来处理前瞻?
答案 0 :(得分:0)
Lookaround
类似于字边界元字符,如 \b
或锚点 ˆ
和 $
,因为它们不匹配文本,而是匹配文本中的位置。
Positive lookahead
在文本中向前查看以查看其子表达式是否可以匹配,如果可以,则作为正则表达式组件成功。 Positive lookahead
用特殊序列 (?=...)
指定。
要了解 lookaround
结构的一个重要方面是,尽管它们通过动作来查看其子表达式是否能够匹配,但它们实际上并不“使用”任何文本 .
1: A(?=B)
这里的 A
确实不是可选的。不过,它也不是前瞻的一部分。如上所述,使用 (?=...)
指定正向前瞻。这里只有 B
是前瞻的一部分。
如果您针对 AB
运行它,则只有 A
会匹配。它在任何意义上并不意味着寻找 A
。这意味着寻找 A
,它后面有一个 B
,但只捕获 A
。
2: (?=B)
仔细想想,这个正则表达式实际上永远不会捕获任何东西。它会找到后面有 B
的位置,但它永远不会捕获 B
。
3: (?=\w)(?=\d)
这个正则表达式不检查是否有单词字符(正则表达式中的单词字符:a-zA-Z0-9_
),后跟一个数字。 (?=\w)
查找位置,其中下一个字符是 单词字符。然后它不消耗任何东西并留在那里。
然而,我们在 (?=\d)
之后还有(?=\w)
。由于我们处于相同的位置,因此我们再次检查下一个相同的字符是否是数字。 这和问一样,找到下一个字符是数字和单词字符的位置。它非常无用,因为仅使用 (?=\d)
就可以实现相同的效果。