html 匹配用户名的正则表达式

p8h8hvxi  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(118)

我正在尝试创建一个正则表达式来验证用户名,该用户名应符合以下条件:

  • 只允许使用一个特殊字符(._-),并且不能位于字符串的两端
  • 第一个字符不能是数字
  • 允许的所有其他字符为字母和数字
  • 总长度应介于3到20个字符之间

这是一个HTML验证模式,所以很遗憾它必须是一个大的正则表达式。
到目前为止,这是我得到的:

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20}

但是肯定的前瞻可以重复不止一次,允许不止一个特殊字符,这不是我想要的,我不知道如何纠正。

jgovgodb

jgovgodb1#

你应该把你的正则表达式分成两部分(而不是两个表达式!),使你的生活更容易:
首先,匹配用户名需要的格式:^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$
现在,我们只需要验证长度约束,为了避免混淆已经找到的模式,可以使用一个非消耗匹配,它只验证字符数(为正则表达式创建一个 * 和 * 模式实际上是一种技巧):(?=^.{3,20}$)
正则表达式只会在长度约束匹配的情况下尝试匹配有效的 format。它是非消耗性的,所以在成功之后,引擎仍然位于字符串的开头。
因此,总而言之:

(?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

Debugger Demo

ttcibm8c

ttcibm8c2#

我认为您需要使用?而不是+,这样特殊字符只匹配一次或不匹配。
^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

相关问题