正则表达式匹配用户名

时间:2015-02-08 10:37:17

标签: regex html5-validation

我正在尝试创建一个regex来验证与以下内容匹配的用户名:

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

这是针对HTML5验证模式的,遗憾的是它必须是一个很大的正则表达式。

到目前为止,这就是我所拥有的:

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

但积极的先行可以重复多次,允许不止一个特殊角色,这不是我想要的。而且我不知道如何纠正这一点。

2 个答案:

答案 0 :(得分:15)

你应该将你的正则表达式分成两部分(而不是两个表达式!),以使你的生活更轻松:

首先,匹配用户名需要的格式: ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

现在,我们只需要验证长度约束。为了不与已经找到的模式混淆,你可以使用一个非消费的匹配,它只验证字符数(它通常用于为正则表达式创建模式): (?=^.{3,20}$)

如果长度约束匹配,正则表达式将仅尝试匹配有效的格式。它是非消耗的,因此在成功之后,引擎仍处于字符串的开头。

所以,所有在一起:

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

Regular expression visualization

Debuggex Demo

答案 1 :(得分:0)

我认为您需要使用?代替+,因此特殊字符只匹配一次或不匹配。

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