正则表达式不允许前导空格,但允许其他任何地方,并且至少需要一个大写和一个小写字母

时间:2017-08-31 11:27:29

标签: javascript regex

我想要正则表达式代码来验证具有以下内容的用户名:

  • 长度在6到30之间

  • 至少包含A-Z

  • 中的一个字母
  • 包含至少一个0-9

  • 的数字
  • 开头不包含空格,但可能在
    处 结束或中间。

  • 可能包含特殊字符

到目前为止,我已经尝试过这个:

^[\S](?=.*\d)(?=.*[A-Z]).{6,30}$

它工作得很好但是当我在开头只选择一个大写字母时它不会验证我的密码。

Test12 34 ----> Doesnt accept but should accept
TesT12 34 ----> Accept 
tesT12 34 ----> Accept

1 个答案:

答案 0 :(得分:0)

问题出现是因为\S处于先行之前的模式开始。这意味着,需要大写ASCII字母和数字的前瞻只会在字符串中的第一个字符后检查它们。

现在,可以有两种情况:1)字符串中可能有任意数量的空白字符,但在其开头,2)字符串中只允许一个空白字符,而不是在开头

场景1

在前瞻之后放置\S并递减限制量词值以将限制设置为6-30,因为\S已匹配并消耗第一个字符:

^(?=.*\d)(?=.*[A-Z])\S.{5,29}$
                    ^^  ^^^^  

请参阅regex demo

JS测试:



var rx = /^(?=.*\d)(?=.*[A-Z])\S.{5,29}$/;
var vals = [ "Test12 34", "TesT12 34", "tesT12 34" ];
for (var s of vals) {
  console.log(s, "=>", rx.test(s));
}




场景2

使用

^(?=.{6,30}$)(?=.*\d)(?=.*[A-Z])\S+(?:\s\S*)?$

长度受限于开头的正向前瞻((?=.{6,30}$)),消费\S+(?:\s\S*)?模式只允许单个\s空格(由于上一个{1或0) {1}} - 一次或零次量词)并且它可以位于中间(因为第一个?使用\S量化,一次或多次出现量词)或结束(+ \S之后的\s - 量化,零次或多次出现量词)。

请参阅regex demo