当正则表达式在可选字符后输入1个字母时,为什么不起作用?

时间:2018-10-17 11:16:04

标签: regex string

我有自定义的正则表达式模式,用于检查网址上的正确用户名:

^[@](?:[a-z][a-z0-9_]*[a-z0-9])?$

这种模式在我写用户名时起作用:

@username
@username_16
@username16

但是在我写这篇文章时不起作用

@u

问题的第一部分:
如何在@u中重写这种工作模式?

问题的第二部分:
如何在@符号后限制或限制控制字符的长度?

1 个答案:

答案 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])?$
  ^^^^^^^^^^^

请参见this regex demo

详细信息

  • ^-字符串的开头
  • (?=.{3,4}$)-一个正向的超前查询,除了换行符外,还需要3或4个字符,直到当前位置右侧的字符串末尾为止(即,从此处的字符串开始)
  • @-一个@字符
  • [a-z]-小写的ASCII字母
  • (?:[a-z0-9_]*[a-z0-9])?-一个可选的非捕获组,匹配出现1或0次
    • [a-z0-9_]*-0+小写ASCII字母,数字或_
    • [a-z0-9]-小写的ASCII字母或数字
  • $-字符串的结尾。