Regex Mastodon username
On Mastodon, a local account has a username of 1 to 30 characters among letters, digits and underscore, case-insensitive (source code: Account model). For remote accounts the same model also accepts dots and hyphens inside the name. The attempts I read reflect that: Mastodon's own USERNAME_ONLY_RE pattern (remote accounts) accepts 'alice.smith' and 'a-b', the local-account rule has no length bound in the regex (the 30 limit is a separate validation), and Maigret, which probes mastodon.social, reuses '[a-zA-Z0-9_]+' with no bound. Here's a pattern applying the local rule and its 30-character limit, compared against those attempts.
/^[a-z0-9_]{1,30}$/ipasses 26/26 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Mastodon USERNAME_ONLY_RE (comptes distants) — accepte points et tirets intérieurs (« alice.smith », « a-b ») et toute longueur | ^[a-z0-9_]+([.-]+[a-z0-9_]+)*$ | 22 / 26 | safe |
| Mastodon, règle des comptes locaux — bon jeu de caractères mais longueur non bornée dans la regex (31 caractères et plus passent) | ^[a-z0-9_]+$ | 25 / 26 | safe |
| Maigret (mastodon.social) — même jeu de caractères, aucune borne de longueur, sans distinction de casse seulement par la classe | ^[a-zA-Z0-9_]+$ | 25 / 26 | safe |
Implementation
const re = new RegExp("^[a-z0-9_]{1,30}$", "i");
re.test(input);Limits
- Valide seulement la forme d'un nom d'utilisateur LOCAL (sans domaine). Les comptes distants (« alice.smith@autre.instance ») suivent une règle plus large, et l'adresse complète « @nom@domaine » n'est pas couverte (voir la fiche domain-name pour la partie domaine).
- Les noms réservés (admin, root, etc.) et l'unicité sont contrôlés par le serveur, pas par la regex ; chaque instance peut être configurée avec une règle différente (plugins, versions anciennes). La règle vient du code source de Mastodon, pas d'une spécification publiée.
- La casse n'est pas significative sur Mastodon : « Alice » et « alice » désignent le même compte. Normalisez en minuscules avant de comparer.