正则表达式匹配用户名
Regex to match a username
我正在尝试创建一个 regex
来验证应与以下内容匹配的用户名:
- 只允许一个特殊字符
(._-)
并且它不能位于字符串的极值处
- 第一个字符不能是数字
- 所有其他允许的字符是字母和数字
- 总长度应在 3 到 20 个字符之间
这是一个 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]+$
我正在尝试创建一个 regex
来验证应与以下内容匹配的用户名:
- 只允许一个特殊字符
(._-)
并且它不能位于字符串的极值处 - 第一个字符不能是数字
- 所有其他允许的字符是字母和数字
- 总长度应在 3 到 20 个字符之间
这是一个 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]+$