Regex CAS Registry Number
A CAS number isn't just "digits separated by hyphens": CAS (Chemical Abstracts Service) itself requires a first group of 2 to 7 digits, never just 1. A real PL/SQL function and a Python library both nonetheless accept a single-digit first group - a number like "5-00-0" would pass their shape check, even though CAS would never actually assign it. Here's a pattern respecting that official bound, compared against those two attempts and a third with no anchoring at all.
/^[0-9]{2,7}-[0-9]{2}-[0-9]$/passes 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| GitHub simonengelke/CAS_Validation (Python 2) — premier groupe illimité (\d+) au lieu de 2-7 chiffres officiels, non ancrée, syntaxe Python 2 invalide en Python 3 | (\d+)-(\d\d)-(\d) | 12 / 20 | vulnerable (000000000000000000000000000000000000000000000000000000000000…) |
| Depth-First (blog technique, 2008) — respecte la borne 2-7 chiffres, mais aucune ancre de début/fin : un numéro CAS valide entouré de texte parasite passe quand même | [0-9]{2,7}-[0-9]{2}-[0-9] | 13 / 20 | safe |
| GitHub abhinavsood/CAS-Number-Validator (fonction Oracle PL/SQL) — accepte un premier groupe d'un seul chiffre, alors que le minimum officiel CAS est 2 | ^\d{1,7}-\d{2}-\d$ | 19 / 20 | safe |
Implementation
const re = new RegExp("^[0-9]{2,7}-[0-9]{2}-[0-9]$", "");
re.test(input);Limits
- Valide seulement la FORME (groupes de 2-7, 2 et 1 chiffres) : ne calcule pas le chiffre de contrôle (somme pondérée modulo 10) — un numéro syntaxiquement valide selon ce motif peut avoir une clé fausse et ne correspondre à aucune substance réellement enregistrée (voir 7732-18-4 dans les exemples, structure de l'eau mais clé fausse).
- Ne consulte pas le registre CAS (SciFinder ou CAS Common Chemistry, common-chemistry.cas.org) : seule cette source confirme qu'un numéro est réellement attribué à une substance.
- Un numéro CAS n'est qu'un identifiant administratif d'enregistrement, jamais réattribué même si la substance est retirée du commerce : ce motif ne peut refléter aucune notion de statut réglementaire actuel (interdiction, restriction).
- Exige des tirets littéraux aux deux positions : les formats sans séparateur ou avec des points, parfois rencontrés dans des bases de données mal normalisées, doivent être convertis avant validation par ce motif.