Javascript正则表达式问题 - 用户名

时间:2013-11-18 11:25:43

标签: javascript regex

问题陈述。

用户名应介于6到32个字母数字字符之间。允许空格,除非它是第一个或最后一个字符。不要将两个以上相同的字符放在一起。允许以下特殊字符:@#$。用户名区分大小写

我们现有的正则表达式

(?!.*(.)\1{2})^[^\s]([0-9]*)([A-Za-z]+)(\w|\@|\#|\$|\s|\-)*[^\s] 

适用于这些测试用例

eldricdsouza
eldric1dsouza
eldric@dsouza
eldric#dsouza
eldric$dsouza
eldric dsouza
 eldric 
 eldricdsouza1
!eldric123#
eeeldric123#
eellldric123#
!user1405!
user@1405!
user@1405#$
user@1405###
user@1405###$
user@144405##$
user@14405##$

这些不适合......

5634user@14405##$ ---gave an error...when this is valid.
usereldric_   --- underscore is not valid
usereldric-dsouza  --- hyphen is not valid.
5634user@14405##$ ---gave an error...when this is valid.
usereldric_   --- underscore is not valid
usereldric-dsouza  --- hyphen is not valid.

或者这......

UseerrNaame78 

2 个答案:

答案 0 :(得分:1)

您可以使用此模式在所有字符串中不超过2个相同的字符:

^(?=[a-zA-Z])(?:([\w@#$-]| (?!$))(?!.*\1.*\1)){6,32}$

但是如果背靠背不超过2个相同的角色,你可以使用:

^(?=[a-zA-Z])(?:([\w@#$-]| (?!$))(?!\1\1)){6,32}$

答案 1 :(得分:0)

符合您要求的正则表达式是:

/^([a-zA-Z@#$])(?!\1)(?:([a-zA-Z@#$ ])(?!\2)){4,30}[a-zA-Z@#$]$/

DEMO:http://regex101.com/r/dS9kE2

一些解释:

  • (?!\1) - (或2)预见下一个字符与最后一个字符不同
  • [a-zA-Z@#$] - 第一个和最后一个位置的已批准字符类
  • [a-zA-Z@#$ ] - 中间认可的字符类
  • {4,30}中间部分必须包含(6-2)和(32-2)个字符