如何使用 JavaScript 创建用户名正则表达式?

How to create a username regular expression with JavaScript?

用户名规则如下:

  1. 用户名只能使用字母数字字符。

  2. 用户名中唯一的数字必须在末尾。最后可以有零个或多个。用户名不能以数字开头。

  3. 用户名字母大小写均可。

  4. 用户名的长度必须至少为两个字符。两个字符的用户名只能使用英文字母作为字符。

我尝试使用以下方法:

对于 (1.) 我做到了 /^[a-zA-Z0-9]/

对于 (2.) 我做到了 /[0-9]*$/

对于 (3.) 已经在 (1.) 中完成

for (4.)(对此我不太确定)/../...尝试将所有这些组合成一个正则表达式语句 我做了:/^[a-zA-Z0-9][0-9]*$../

您可以使用否定先行断言字符串不以字符 a-zA-Z 后跟可选数字开头。

然后以 1+ 个字符开始匹配 a-zA-Z 并以可选数字结束。

^(?![A-Za-z]\d?$)[a-zA-Z]+\d*$

说明

  • ^ 字符串开头
  • (?![A-Za-z]\d?$) 否定前瞻,断言不是字符 a-zA-Z 后跟可选数字和字符串结尾
  • [a-zA-Z]+\d* 匹配 1+ 个字符 a-zA-Z 后跟可选数字,这样字符串就不能以数字开头
  • $ 字符串结束

Regex demo

const regex = /^(?![A-Za-z]\d?$)[a-zA-Z]+\d*$/;
[
  "tt",
  "tt2",
  "test",
  "a11",
  "t2",
  "t",
  "1",
  "t1t"
].forEach(s => console.log(`${s} ==> ${regex.test(s)}`));

尽管答案很好,但对于一只新蜜蜂来说可能并不容易 这做完全一样的事情

^([a-z]{2,}|[a-z][0-9]{2,})[0-9]*$

这样^表示字符串的开始位置,表示字符串的开头 ()用于定义一个组,本例中定义的组为最小长度为2的全小写字母,因为{}用于指定字符串的长度 然后那里使用的管道符号 | 表示“或”,然后下一个表达式是 [a-z][0-9]{2,} 这意味着所有小写字母后跟一个最小长度应为 2 的整数。 最后,在该组之后,它们可以出现零次或多次整数,这是使用 * 符号强制执行的,并且 $ 表示字符串的结尾 所以这个正则表达式是这样读的:从字符串的开头,它应该以最小长度为 2 的小写字母开头,或者以小写字母和数字开头,但数字长度不能小于 2 那么你可以有一系列整数或数字在它们之后,或者你可以有 none 这是一个非常直接和受限的解决方案,可能应该用于学习目的,或者在实际需要的情况下,在实际应用中可能需要更灵活的正则表达式

更多细分:

^([a-z]{2,}|[a-z][0-9]{2,})[0-9]*$

'^` 断言行首的位置

第一个捕获组([a-z]{2,}|[a-z][0-9]{2,})

第一个选择[a-z]{2,}

匹配下面列表中的单个字符 [a-z]{2,}

{2,} 量词——匹配 2 次到无限次,尽可能多的次数,按需回馈(贪心)

a-z 'a'(索引 97)和 'z'(索引 122)之间的单个字符(区分大小写)

第二选择[a-z][0-9]{2,} 匹配下面列表中的单个字符 [a-z]

a-z a(索引 97)和 z(索引 122)之间范围内的单个字符(区分大小写)

匹配下面列表中的单个字符 [0-9]{2,}

{2,} 量词——匹配次数在 2 到无限次之间,尽可能多的次数,根据需要回馈(贪心) 0-9 0(索引 48)和 9(索引 57)之间的单个字符(区分大小写)

匹配[0-9]下方列表中的单个字符* * 量词——在零次和无限次之间匹配,尽可能多次,按需回馈(贪心)

0-9 0(索引 48)和 9(索引 57)之间的单个字符(区分大小写)

$ 声明行尾的位置

Demo

import re 
pattern="^([a-z]{2,}|[a-z][0-9]{2,})[0-9]*$"
if re.match(pattern,input()):
    print("Ok")
else:
    print("Not ok")