正则表达式匹配用户名

Regex to match a username

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

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

到目前为止,这是我得到的:

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

但是正向前瞻可以重复多次,允许超过一个特殊字符,这不是我想要的。而且我不知道如何纠正它。

我认为你需要使用?而不是+,所以特殊字符是否只匹配一次。

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

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

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

现在,我们只需要验证长度限制。为了不弄乱已经找到的模式,您可以使用只验证字符数的非消耗性匹配(它实际上是为您的常规创建 and 模式的黑客表达式): (?=^.{3,20}$)

正则表达式只会尝试匹配有效的 格式 如果匹配长度限制。它是非消耗的,所以成功后,引擎仍然在字符串的开头。

所以,总的来说:

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

Debugger Demo