在RegEx中对“.”和“_”应用限制

nvbavucw  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(70)

我想写一个RegEx的用户名验证。用户名必须超过6个字符,并以字母(大写或小写)开头,但在下面,您可以使用字母,数字,点或下划线。重点是,使用点和下划线是可选的,但如果你决定使用它们,你有权只写一次,如果使用两次或更多次,那么用户名是错误的。举例来说:

jamesbrianquinn     //ture
james.brianquinn    //true
james.brian_quinn   //true
james.brian.quinn   //false
james_brian_quinn   //false
james.brian__quinn  //false

字符串
点和下划线的位置并不重要。唯一重要的是它们不应该是用户名的第一个字母或重复多次。
我尝试使用“?“,但对我来说不起作用:

/^[a-zA-Z][a-zA-Z0-9.?_?]+$/g


那么,什么是正确的RegEx???

fcipmucu

fcipmucu1#

您可以使用负的lookaheads来强制最多使用一个点或下划线:

^(?!.*\..*\.)(?!.*_.*_)[A-Za-z][A-Za-z0-9._]{5,}$

字符串
这个模式表示匹配:

  • ^用户名的开头
  • (?!.*\..*\.)Assert不出现两个点(=最多一个点)
  • (?!.*_.*_)Assert不出现两个下划线(=最多一个_
  • [A-Za-z]第一个字符是字母
  • [A-Za-z0-9._]{5,}以下五个或更多有效字符
  • 用户名的结尾
6ioyuze2

6ioyuze22#

使用一个先行、一个后向引用和一个不区分大小写的标志/i

^[A-Z](?!.*([._]).*\1)[\w.]{5,}$

字符串
模式匹配:

  • ^字符串开头
  • [A-Z]匹配单个字符A-Z
  • (?!.*([._]).*\1)负先行,使用捕获组([._])内的字符类Assert._不超过2次,并使用反向引用匹配表示为\1的相同字符
  • [\w.]{5,}匹配5次或更多次单词char或.
  • $字符串结束

Regex demo

const regex = /^[A-Z](?!.*([._]).*\1)[\w.]{5,}$/i;
[
  "jamesbrianquinn",
  "james.brianquinn",
  "james.brian_quinn",
  "james.brian.quinn",
  "james_brian_quinn",
  "james.brian__quinn"
].forEach(s =>
  console.log(`${s} --> ${regex.test(s)}`)
);

相关问题