2015-02-08 164 views
5

我想创建一个regex验证应符合以下的用户名:允许正则表达式匹配用户名

  • 只有一个特殊字符(._-),它绝不能以字符串的极值
  • 第一个字符不能是数
  • 所有允许的其它字符是字母和数字
  • 总长度应为3之间和20个字符

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

到目前为止,这是我的本钱:

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

但正向前查找可重复超过一次允许超过一个特殊字符,这不是我想要的东西。而我不知道如何改正这一点。

+0

不是一个答案 - 但是你需要打破'.'在'[._-]'。 – amit 2015-02-08 10:44:11

+0

对于这个复杂的东西,你为什么选择使用html验证模式呢?您可以触发处理验证的事件而不是模式。 – Eclecticist 2015-02-08 10:46:18

+0

@amit [._-]是列表中的单个字符“._-”的字面意思,所以点不被认为是任何字符,所以我认为我不需要破坏它 – Tofandel 2015-02-08 10:48:40

回答

14

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

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

现在,我们只需要验证长度约束。为了不角落找寻与已发现的格局混乱,你可以使用非消耗比赛,只有验证字符数(其litterally用于创建正则表达式的模式的黑客):(?=^.{3,20}$)

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

所以,一起:

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

Regular expression visualization

Debuggex Demo

+1

谢谢大师的正则表达式,这个工程(我只需要取代最后*由一个+所以一个特殊的字符不能在最后 – Tofandel 2015-02-08 10:56:02

+1

@ Adri1du40指出,以及。已经修复了) – dognose 2015-02-08 10:56:19

0

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

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

+0

这只会允许一个特殊字符在字符串的开头 – Tofandel 2015-02-08 10:52:51

+0

@ Adri1du40你确定吗?我想'''基本上是'+',除了它只匹配零次或一次。 – 2015-02-08 10:55:23

+0

是的,这是'?'但是如果你让一个字符在特殊字符之前为零,那么一个特殊的字符可以在开头 – Tofandel 2015-02-08 11:00:45