正则表达式以验证用户名

moh*_*sti 44 html php java regex perl

我正在尝试创建一个正则表达式来根据这些条件验证用户名:

  1. 仅包含字母数字字符, 下划线.
  2. 下划线和点不能位于用户名的末尾开头(例如_username/ username_/ .username/ username.).
  3. 下划线和点不能彼此相邻(例如user_.name).
  4. 下划线或点不能连续多次使用(例如user__name/ user..name).
  5. 字符数必须介于8到20之间.

这就是我到目前为止所做的事情; 听起来它强制执行所有标准规则但是第5条规则.我不知道如何添加第五条规则:

 ^[a-zA-Z0-9]+([._]?[a-zA-Z0-9]+)*$
Run Code Online (Sandbox Code Playgroud)

Ωme*_*ega 185

^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$
 ?????????????????????????????????????????????? ?????????
       ?         ?         ?            ?           no _ or . at the end
       ?         ?         ?            ?
       ?         ?         ?            allowed characters
       ?         ?         ?
       ?         ?         no __ or _. or ._ or .. inside
       ?         ?
       ?         no _ or . at the beginning
       ?
       username is 8-20 characters long
Run Code Online (Sandbox Code Playgroud)

  • @ridgerunner - 我相信这种方式很容易阅读和移植代码. (12认同)
  • ASCII图像仍然是最好的.+1 (5认同)
  • @vigneshkumar - 意思相同,但 `[a-zA-Z0-9._]` 易于阅读和理解 (3认同)
  • 请注意,此正则表达式会导致 Angular 应用程序在 IOS 设备以及 Firefox 浏览器上崩溃。 (3认同)
  • `(?&lt;![_.])$` 中的 `&lt;` 导致我解析错误“正则表达式无效” (2认同)
  • @JacksonLenhart - 你使用什么正则表达式引擎和编程语言?请注意这个问题用`asp.net`标签标记,虽然答案对大多数其他语言和引擎有效,但并非所有支持负向前瞻和后观零长度断言. (2认同)

Jam*_*urz 12

尽管我喜欢正则表达式,但我认为可读性是有限的

所以我建议

new Regex("^[a-z._]+$", RegexOptions.IgnoreCase).IsMatch(username) &&
!username.StartsWith(".") &&
!username.StartsWith("_") &&
!username.EndsWith(".") &&
!username.EndsWith("_") &&
!username.Contains("..") &&
!username.Contains("__") &&
!username.Contains("._") &&
!username.Contains("_.");
Run Code Online (Sandbox Code Playgroud)

它更长,但不需要维护者打开 expresso 来理解。

当然你可以评论一个很长的正则表达式,但是读过它的人必须依赖于信任......


Pat*_*ald 8

对Phillip的回答略有修改,修复了最新的要求

^[a-zA-Z0-9]([._](?![._])|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$
Run Code Online (Sandbox Code Playgroud)


Phi*_*teG 7

我想你必须在这里使用Lookahead表达式.http://www.regular-expressions.info/lookaround.html

尝试

^[a-zA-Z0-9](_(?!(\.|_))|\.(?!(_|\.))|[a-zA-Z0-9]){6,18}[a-zA-Z0-9]$

[a-zA-Z0-9] 一个字母数字那么(

_(?!\.)a _后面没跟a.要么

\.(?!_)一个 .没有跟着_ OR

[a-zA-Z0-9] 一个字母数字)FOR

{6,18} 至少6到最多18倍然后

[a-zA-Z0-9] 一个字母数字

(第一个字符是alphanum,然后是6到18个字符,最后一个字符是alphanum,6 + 2 = 8,18 + 2 = 20)

  • 是的,这个有效.但是`(_ | \.)`表达式可以简化为`[_.]`. (3认同)