使用lookahead,如何确保至少包含4个字母数字字符+下划线

avn*_*v99 6 javascript regex

我试图确保输入中至少包含 4 个字母数字字符,并且也允许使用下划线。

正则表达式教程有点超出我的理解,因为它讨论了断言以及匹配时的成功/失败。

^\w*(?=[a-zA-Z0-9]{4})$
Run Code Online (Sandbox Code Playgroud)

我的理解:

\w--> 字母数字+下划线

*--> 匹配前一个标记零次到无限次(所以,这意味着它可以是任何字母数字/下划线字符,对吗?)

(?=[a-zA-Z0-9]{4})--> 向前查看前面的字符,如果它们至少包含 4 个字母数字字符,那么我就很好。

显然我错了,因为 regex101 没有向我显示任何匹配项。

The*_*ird 3

您的模式^\w*(?=[a-zA-Z0-9]{4})$不匹配,因为:

  • ^\w*从字符串开头匹配可选单词字符,如果只有单词字符,它将匹配直到字符串末尾
  • (?=[a-zA-Z0-9]{4})如果正向预测可以从当前位置向右断言 4 个连续的字母数字字符,则正向预测为真。允许\w*回溯,并且可以回溯4个位置以使断言为真。
  • 但是$断言字符串的结尾,它无法匹配,因为位置向左移动了 4 步来满足之前的正向先行断言。

使用前瞻,您可以做的是断言 4 个字母数字字符,前面带有可选的下划线。

如果断言为真,则匹配 1 个或多个单词字符。

^(?=(?:_*[a-zA-Z0-9]){4})\w+$
Run Code Online (Sandbox Code Playgroud)

模式匹配:

  • ^字符串的开头
  • (?=积极向前看,断言右边是什么
    • (?:_*[a-zA-Z0-9]){4}重复 4 次匹配可选_后跟字母数字字符
  • )关闭前瞻
  • \w+匹配 1+ 个单词字符(包括_
  • $字符串结尾

正则表达式演示