Regex Chilean RUT
A Chilean RUT is a number of 1 to 8 digits, a hyphen and a check character from 0 to 9 or K, often written with dots: '76.793.310-K'. Real attempts get it wrong in both directions. django-localflavor's strict mode requires the dots and rejects '76793310-K' as well as '11-6'. Its non-strict mode accepts '1.2.3-4' and '12.345678-5'. The rut.js library accepts '12.345678-5' and an 11-digit body. Here's a pattern requiring the hyphen and either well-placed dots or none, compared against those attempts.
/^(?:[1-9]\d?(?:\.\d{3}){2}|[1-9]\d{0,2}(?:\.\d{3})?|[1-9]\d{0,7})-[\dkK]$/passes 25/25 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| django-localflavor (mode strict) — points obligatoires : rejette « 76793310-K », « 11-6 » et « 6-K », pourtant valides | ^(\d{1,2}\.)?\d{3}\.\d{3}-[\dkK]$ | 21 / 25 | safe |
| django-localflavor (mode non strict) — points n'importe où : « 1.2.3-4 », « 12.345678-5 », « 1234.567-8 » et « 12.345.678.9-5 » passent ; tiret facultatif | ^[\d\.]{1,11}-?[\dkK]$ | 19 / 25 | safe |
| rut.js (npm) — points facultatifs groupe par groupe : « 12.345678-5 », « 1234.567-8 » et un corps de 11 chiffres passent ; tiret facultatif ; rejette le zéro initial | ^([1-9]\d{0,2}(\.?\d{3})*)-?[\dkK]$ | 20 / 25 | safe |
Implementation
const re = new RegExp("^(?:[1-9]\\d?(?:\\.\\d{3}){2}|[1-9]\\d{0,2}(?:\\.\\d{3})?|[1-9]\\d{0,7})-[\\dkK]$", "");
re.test(input);Limits
- Valide seulement la FORME : ne calcule pas la clé modulo 11. « 12.345.678-9 » (la bonne clé est 5) et « 1.985.231-K » (la bonne est 8) ont la bonne forme mais une clé fausse, et passent ce motif ; seul un calcul dans le code les rejette.
- Les points sont une convention d'affichage, pas une règle du SII : le motif accepte soit des points bien placés (« 76.793.310-K »), soit aucun (« 76793310-K »). Normalisez en « 76793310-K » avant de stocker.
- Exige un tiret avant la clé, que certaines saisies omettent (« 767933106 ») : ce motif les rejette. Le K doit être majuscule dans les fichiers du SII ; ce motif accepte aussi « k » : normalisez la casse avant stockage.
- L'algorithme de la clé vient de Wikipédia et du code de django-localflavor et de rut.js : aucune page officielle du SII consultée ne le décrit. Un corps de 8 chiffres au plus est une limite pratique, pas une règle documentée.