^[a-zA-Z0-9_-]{3,16}$
Matches:
✓ john_doe
✓ user123
✓ dev-account
^[a-zA-Z0-9_-]{3,16}$Minimum 3 prevents single-letter usernames. Maximum 16 is a UX and database best practice.
This pattern allows it. To require letter-start, use: ^[a-zA-Z][a-zA-Z0-9_-]{2,15}$