Regex RUT chilien
Un RUT chilien est un numéro de 1 à 8 chiffres, un tiret et une clé de 0 à 9 ou K, souvent écrit avec des points : « 76.793.310-K ». Les tentatives réelles se trompent dans les deux sens. Le mode strict de django-localflavor exige les points et rejette « 76793310-K » comme « 11-6 ». Son mode non strict accepte « 1.2.3-4 » et « 12.345678-5 ». La bibliothèque rut.js accepte « 12.345678-5 » et un corps de 11 chiffres. Voici un motif qui impose le tiret, des points bien placés ou pas de points du tout, comparé à ces tentatives.
/^(?:[1-9]\d?(?:\.\d{3}){2}|[1-9]\d{0,2}(?:\.\d{3})?|[1-9]\d{0,7})-[\dkK]$/passe 25/25 cas
Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| 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 | sûr |
| 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 | sûr |
Implémentation
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);Limites
- 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.