我正在尝试创建一个正则表达式来验证用户名,该用户名应符合以下条件:
- 只允许使用一个特殊字符
(._-)
,并且不能位于字符串的两端 - 第一个字符不能是数字
- 允许的所有其他字符为字母和数字
- 总长度应介于3到20个字符之间
这是一个HTML验证模式,所以很遗憾它必须是一个大的正则表达式。
到目前为止,这是我得到的:
^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20}
但是肯定的前瞻可以重复不止一次,允许不止一个特殊字符,这不是我想要的,我不知道如何纠正。
2条答案
按热度按时间jgovgodb1#
你应该把你的正则表达式分成两部分(而不是两个表达式!),使你的生活更容易:
首先,匹配用户名需要的格式:
^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$
现在,我们只需要验证长度约束,为了避免混淆已经找到的模式,可以使用一个非消耗匹配,它只验证字符数(为正则表达式创建一个 * 和 * 模式实际上是一种技巧):
(?=^.{3,20}$)
正则表达式只会在长度约束匹配的情况下尝试匹配有效的 format。它是非消耗性的,所以在成功之后,引擎仍然位于字符串的开头。
因此,总而言之:
Debugger Demo
ttcibm8c2#
我认为您需要使用
?
而不是+
,这样特殊字符只匹配一次或不匹配。^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}