Regex Minecraft (Java Edition) username
A Minecraft Java Edition username isn't just "letters, digits and underscore": Mojang enforces a 3-character minimum, a rule that a Go library actually used in production (minotar, the skin API) ignores by accepting a single character. A GitHub repository goes further with a classic anchor bug: an unparenthesized alternation means "^" and "$" each bind to only one branch, letting through strings far longer than intended. Here's a pattern respecting the real 3-16 range, compared against these three attempts.
/^[A-Za-z0-9_]{3,16}$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| minotar/minecraft (bibliothèque Go de l'API de skins minotar.net, en production) — minimum 1 caractère au lieu de 3 | [a-zA-Z0-9_]{1,16} | 8 / 22 | safe |
| Forum technique BetterPHP (2012) — minimum 2 caractères au lieu de 3 | [A-Za-z0-9_]{2,16} | 9 / 22 | safe |
| GitHub XPPlugins/CnUsername — alternance sans parenthèses : « ^ » ne porte que sur la première branche et « $ » que sur la seconde, laissant passer des chaînes bien plus longues que prévu | ^[a-zA-Z0-9_]{3,16}|[a-zA-Z0-9_一-龥]{2,10}$ | 9 / 22 | safe |
Implementation
const re = new RegExp("^[A-Za-z0-9_]{3,16}$", "");
re.test(input);Limits
- Valide seulement la FORME (3-16 caractères parmi lettres/chiffres/underscore) : ne consulte pas l'API Mojang (sessionserver.mojang.com) pour confirmer qu'un pseudo est réellement attribué et actif.
- N'impose pas les restrictions de contenu de Mojang (pseudos offensants ou trompeurs interdits, indépendamment de la forme) : un pseudo syntaxiquement valide peut malgré tout être refusé à la création par Mojang pour des raisons de modération.
- Ne couvre que le Java Edition : le Bedrock Edition (consoles, mobile) utilise un Gamertag Xbox partagé entre plateformes, avec ses propres règles de longueur et de caractères.
- Ne reflète pas l'historique des changements de pseudo : Mojang limite à un changement tous les 30 jours et conserve l'historique des anciens pseudos, deux règles qu'une regex sur une seule chaîne ne peut pas exprimer.