如何使用 JavaScript 创建用户名正则表达式?
How to create a username regular expression with JavaScript?
用户名规则如下:
用户名只能使用字母数字字符。
用户名中唯一的数字必须在末尾。最后可以有零个或多个。用户名不能以数字开头。
用户名字母大小写均可。
用户名的长度必须至少为两个字符。两个字符的用户名只能使用英文字母作为字符。
我尝试使用以下方法:
对于 (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 后跟可选数字,这样字符串就不能以数字开头
$
字符串结束
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)之间的单个字符(区分大小写)
$
声明行尾的位置
import re
pattern="^([a-z]{2,}|[a-z][0-9]{2,})[0-9]*$"
if re.match(pattern,input()):
print("Ok")
else:
print("Not ok")
用户名规则如下:
用户名只能使用字母数字字符。
用户名中唯一的数字必须在末尾。最后可以有零个或多个。用户名不能以数字开头。
用户名字母大小写均可。
用户名的长度必须至少为两个字符。两个字符的用户名只能使用英文字母作为字符。
我尝试使用以下方法:
对于 (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 后跟可选数字,这样字符串就不能以数字开头$
字符串结束
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)之间的单个字符(区分大小写)
$
声明行尾的位置
import re
pattern="^([a-z]{2,}|[a-z][0-9]{2,})[0-9]*$"
if re.match(pattern,input()):
print("Ok")
else:
print("Not ok")