Regex 为什么’;当正则表达式在可选字符后输入1个字母时不起作用?
我使用自定义正则表达式模式检查url上的正确用户名:Regex 为什么’;当正则表达式在可选字符后输入1个字母时不起作用?,regex,string,Regex,String,我使用自定义正则表达式模式检查url上的正确用户名: ^[@](?:[a-z][a-z0-9_]*[a-z0-9])?$ 当我编写用户名时,此模式起作用: @username @username_16 @username16 但当我写的时候,它不起作用: @u 问题的第一部分: 如何为@u中的工作重写此模式 问题的第二部分: 控制字符在@符号之后是如何限制或长度的?在可选组中,[a-z]和[a-z0-9]是必须的模式,因此如果@之后有字符,则必须至少有两个字符 此外,正则表达式还匹配一个等
^[@](?:[a-z][a-z0-9_]*[a-z0-9])?$
当我编写用户名时,此模式起作用:
@username
@username_16
@username16
但当我写的时候,它不起作用:
@u
问题的第一部分:如何为
@u
中的工作重写此模式
问题的第二部分:控制字符在
@
符号之后是如何限制或长度的?在可选组中,[a-z]
和[a-z0-9]
是必须的模式,因此如果@
之后有字符,则必须至少有两个字符
此外,正则表达式还匹配一个等于@
的字符串
要解决所有这些问题,您可以使用
^@[a-z](?:[a-z0-9_]*[a-z0-9])?$
看
现在,要限制@
符号后字符串的长度,您可以在@
之后插入一个(?=.{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}$)
-一个@
字符@
-小写ASCII字母[a-z]
-一个可选的非捕获组,匹配(?:[a-z0-9\]*[a-z0-9])?
-0+小写ASCII字母、数字或[a-z0-9.]*
-小写ASCII字母或数字[a-z0-9]
-字符串结束$
@
吗?您的正则表达式允许这样做。我建议^[a-z](?:[a-z0-9.]*[a-z0-9])?$
如果不是。是的,symbol
需要启动用户名@Wiktor StribiżewI,我的意思是,你真的想匹配一个没有字母或数字的
字符串还是后面有
的字符串?只有
不匹配。仅使用@
更正用户名,需要a-Z此模式工作,但如何控制@
符号后的字符长度?@Otabek请提供一个示例。提示:您可以使用类似^(?=[A-z0-9{6,18}$)@[A-z](?:[A-z0-9\*[A-z0-9])?$
的lookahead来控制字符串的总长度,以匹配长度为6到18个字符的字符串。例如,我有自定义用户名@us\u 1
。这里我在@
符号之后有4个字符[us_1],以及如何仅在@
之后限制最大和最小字符长度。例如,在@
符号字符后,最小长度为3,最大长度为4。在这种情况下,这个用户名将是正确的:@us_1,@us2。这是不正确的用户名:@use_2和@user_stack_22@Wiktor Stribiżew@Otabek好的,^@[a-z](?:[a-z0-9{1,2}[a-z0-9])?$
将匹配以@
开头的字符串,然后有3或4个字符。看见也就是说,从阈值中减去2,就可以得到限制量词的值。然而,一个更通用的解决方案是^@[a-z](?=[a-z0-9.]{2,3}$)(?:[a-z0-9.*[a-z0-9])?$
@Otabek,这部分问题没有您的尝试。我不知道你的代码是什么样子,你使用的是什么编程语言。展示它。