Regex code ICD-10-CM (diagnostic)
Un code ICD-10-CM (diagnostic américain) a 3 à 7 caractères : une lettre, un chiffre, puis un chiffre ou « A » et « B » (« D3A », « Z3A »), un point après le troisième caractère, puis 1 à 4 caractères alphanumériques, par exemple « E11.9 » ou « S72.001A ». Les lignes directrices officielles du CMS disent que les caractères peuvent être des lettres ou des chiffres et que les codes ont 3, 4, 5, 6 ou 7 caractères. Les tentatives relues sont soit trop strictes (Wikidata P4229 impose un chiffre en 3e caractère et rejette « D3A.8 »), soit trop lâches (identifiers.org accepte « A1.- »…), soit acceptent des plages de blocs « E08-E13 » (bioregistry). Voici un motif sur la structure du CMS, comparé à ces tentatives.
/^[A-Z][0-9][0-9AB](?:\.[0-9A-Z]{1,4})?$/passe 32/32 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| bioregistry (icd10cm) — jeu de caractères fin par position, très proche du Tabular List ; seule différence relevée sur le corpus : accepte les plages de blocs (« E08-E13 ») | ^([A-Z][0-9][0-9AB]((-[A-Z][0-9][0-9AB])|(\.[0-9A-KXZ]([0-9A-EXYZ]([0-9A-HX][0-59A-HJKMNP-S]?)?)?)?))$ | 31 / 32 | sûr |
| Wikidata P4229 (ICD-10-CM) — 3e caractère chiffre obligatoire : « D3A.8 » et « Z3A.01 » refusés ; non ancrée ; accepte les blocs (« E08-E13 ») et toute longueur après le point | [A-Z]\d{2}(-[A-Z]\d{2}|[.][A-Z\d]+|) | 23 / 32 | sûr |
| Wikidata P494 (CIM-10 OMS, 1 à 2 décimales) — trop étroite pour ICD-10-CM : lettres après le point et 3e caractère A/B refusés, non ancrée | [A-Z]\d{2}(?:\.\d{1,2})? | 23 / 32 | sûr |
| identifiers.org (icd) — « [-\d+] » est une classe : « E11.- » et « E11.+ » passent, un seul caractère après le point, 3e caractère A/B refusé, nombre de chiffres libre | ^[A-Z]\d+(\.[-\d+])?$ | 18 / 32 | sûr |
Implémentation
const re = new RegExp("^[A-Z][0-9][0-9AB](?:\\.[0-9A-Z]{1,4})?$", "");
re.test(input);Limites
- Valide seulement la FORME ICD-10-CM : un code bien formé peut ne pas exister (« Z99.999Z » passe) ni être facturable (les codes de 3 à 6 caractères peuvent avoir des sous-divisions et seul le dernier niveau est utilisable pour le reporting). L'existence se vérifie dans la liste annuelle du CDC/CMS ou une API (NLM Clinical Tables).
- Ne vaut pas pour la CIM-10 de l'OMS (sans « U » étendu ni 7e caractère) ni pour ICD-10-PCS (7 caractères sans point) ni pour la CIM-11. La forme sans point (« E119 »), utilisée en facturation, est refusée : ajoutez ou retirez le point avant validation.
- Les minuscules sont refusées (les lignes directrices ne disent pas que la casse compte : normalisez en majuscules). Les plages de blocs (« E08-E13 ») ne sont pas des codes et sont refusées.