我有自定义的正则表达式模式,用于检查网址上的正确用户名:
^[@](?:[a-z][a-z0-9_]*[a-z0-9])?$
这种模式在我写用户名时起作用:
@username
@username_16
@username16
但是在我写这篇文章时不起作用
@u
问题的第一部分:
如何在@u
中重写这种工作模式?
问题的第二部分:
如何在@
符号后限制或限制控制字符的长度?
答案 0 :(得分:2)
[a-z]
和[a-z0-9]
是可选组中的强制性模式,因此,如果@
之后有一些字符,则至少必须有两个字符。
此外,您的正则表达式还匹配一个等于@
的字符串。
要解决所有这些问题,您可以使用
^@[a-z](?:[a-z0-9_]*[a-z0-9])?$
请参见regex demo。
现在,要限制@
符号后面的字符串的长度,可以在(?=.{x,m}$)
之后插入@
正向超前。例如,要仅匹配@
之后的3或4个字符,请使用:
^@(?=[a-z0-9_]{3,4}$)[a-z](?:[a-z0-9_]*[a-z0-9])?$
^^^^^^^^^^^^^^^^^^^
或者,因为使用模式会验证其余部分
^@(?=.{3,4}$)[a-z](?:[a-z0-9_]*[a-z0-9])?$
^^^^^^^^^^^
详细信息
^
-字符串的开头(?=.{3,4}$)
-一个正向的超前查询,除了换行符外,还需要3或4个字符,直到当前位置右侧的字符串末尾为止(即,从此处的字符串开始)@
-一个@
字符[a-z]
-小写的ASCII字母(?:[a-z0-9_]*[a-z0-9])?
-一个可选的非捕获组,匹配出现1或0次
[a-z0-9_]*
-0+小写ASCII字母,数字或_
[a-z0-9]
-小写的ASCII字母或数字$
-字符串的结尾。