^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$ ^(?=.{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 If your browser raises an error due to lack of negative look-behind support, use the following alternative pattern: ^(?=[a-zA-Z0-9._]{8,20}$)(?!.*[_.]{2})[^_.].*[^_.]$