Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么’;当正则表达式在可选字符后输入1个字母时不起作用?_Regex_String - Fatal编程技术网

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

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]是必须的模式,因此如果@之后有字符,则必须至少有两个字符 此外,正则表达式还匹配一个等

我使用自定义正则表达式模式检查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])?$

现在,要限制
@
符号后字符串的长度,您可以在
@
之后插入一个
(?=.{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])?
    -一个可选的非捕获组,匹配
    • [a-z0-9.]*
      -0+小写ASCII字母、数字或
    • [a-z0-9]
      -小写ASCII字母或数字
  • $
    -字符串结束

应该通过
@
吗?您的正则表达式允许这样做。我建议
^[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,这部分问题没有您的尝试。我不知道你的代码是什么样子,你使用的是什么编程语言。展示它。