I have created this regular expression to validate usernames which I need in my projects:
^(?=.{3,32}$)(?!.*[._-]{2})(?!.*[0-9]{5,})[a-z](?:[\w]*|[a-z\d\.]*|[a-z\d-]*)[a-z0-9]$
It works just fine. But I'm wondering if there is any improvement and optimization for it, since I'm not exactly a regex-guy.
The regex and tests are available here.
Rules are:
- usernames should start with
[a-z]
- usernames should end with
[a-z0-9]
- usernames can have a length between 3 and 32
- usernames can contain any of
[a-z0-9\._-]
- Numbers should not be in the vicinity of each other more than 4 times. I mean
p1234
is a match andp12345
is not. - each username can contains only one of
[\._-]
. I mean a username can contain.
or-
or_
- each
.
,-
, and_
should be followed by an alpha-numeric. I mean a.
can not be followed by another.
. They should not be in the vicinity of each other.
Tests:
j1vad-amiry match
j1vad-ami-ry match
ja23d_am8ry match
ja_23d_am8ry match
jav5d2.am3y match
jav.ad.amiry match
jav.ad.ami.ry.2 match
ja3fd4 match
page2491 match
page24915 not match
jav-ad_amiry not match
javad_am-iry not match
jav.ami-ry not match
jav.ami_ry not match
jav.ami__ry not match
2jav not match
2jav_ad not match
2jav_ad3 not match