挑战: 限制可能的用户名

告诉我们发生了什么:
在此详细描述你的问题。

你目前的代码


let username = "JackOfAllTrades";
let userCheck = /^[a-z][a-z]+\d*$/i; // 修改这一行
let result = userCheck.test(username);

你的浏览器信息:

用户代理是: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59

挑战: 限制可能的用户名

挑战的链接:

感觉好多人问这道题啊。
供参考:

let username = "JackOfAllTrades";
const userCheck = /^[a-z]([0-9]{2,}|[a-z]+\d*)$/i;
let result = userCheck.test(username);

你的代码处理不了这个情况:
image

因为按照你的写法,开头必须有两个字母,[a-z] 是第一个然后 [a-z]+ 是第二个。
根据题目要求,用户名是两个字符的时候必须是全字母,但三个或以上就可以只有一个字母。
所以就是开头第一个字符必须是字母,第二个要分情况:

  • 如果是数字,那必须是两个或以上
  • 如果是字母,那一个就可以

我这个是错的,我就是想问问,正确答案是什么。

开头必须是字母,代码是 ^[a-zA-Z]
然后分情况,两者是并列的关系:

  • 如果是数字,那必须是两个或以上,代码是 \d{2,}
  • 如果是字母,那一个以上就可以,代码是 [a-zA-Z]+
    • 这种情况后面还可以有(不是必须有)数字,所以 [a-zA-Z]+\d*

连起来就是 ^[a-zA-Z](\d{2,}|[a-zA-Z]+\d*)$
考虑到不区分大小写,可以用 i flag,所以 /^[a-z](\d{2,}|[a-z]+\d*)$/i