正则表达式中的前瞻

时间:2021-06-14 14:14:17

标签: javascript regex

我正在学习关于 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,然后检查是否存在是一个字母数字字符,最后因为两个搜索都返回真,整个正则表达式测试返回真)。但这似乎与我链接的帖子中提到的定义不一致。计算机“内部”是否有更通用的定义或算法来处理前瞻?

1 个答案:

答案 0 :(得分:0)

定义

Lookaround 类似于字边界元字符,如 \b 或锚点 ˆ$,因为它们不匹配文本,而是匹配文本中的位置。

Positive lookahead 在文本中向前查看以查看其子表达式是否可以匹配,如果可以,则作为正则表达式组件成功Positive lookahead 用特殊序列 (?=...) 指定。


Lookaround 不要cosume 文字

要了解 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) 就可以实现相同的效果。

相关问题