Regex code ATC (médicament)
La classification ATC de l'OMS (centre collaborateur d'Oslo) a cinq niveaux : un groupe anatomique (14 lettres : A B C D G H J L M N P R S V), un sous-groupe thérapeutique (2 chiffres), pharmacologique (1 lettre), chimique (1 lettre) et la substance (2 chiffres), soit « A10BA02 » pour la metformine. Les tentatives relues ne suivent pas cette liste : bioregistry et identifiers.org acceptent n'importe quelle lettre et un nombre quelconque de chiffres, l'expression Wikidata (format) exige un chiffre final et accepte jusqu'à « V », celle de la contrainte Wikidata est correcte mais sans ancres. Voici un motif qui limite le premier caractère aux 14 groupes et accepte les niveaux 1, 2, 3, 4 et 5, comparé à ces tentatives.
/^[ABCDGHJLMNPRSV](?:[0-9]{2}(?:[A-Z](?:[A-Z](?:[0-9]{2})?)?)?)?$/passe 36/36 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| bioregistry / identifiers.org — n'importe quelle lettre initiale et n'importe quel nombre de chiffres : « E10BA02 », « A1 » et « A10BA2 » passent | ^[A-Z](\d+([A-Z]{1,2}(\d+)?)?)?$ | 26 / 36 | sûr |
| Wikidata P267 (format de la propriété) — chiffre final obligatoire, lettres initiales A-V (E, F, I… acceptés), jamais « A10BA » (4e niveau) seul, non ancrée | [A-V]([0-9][0-9]([A-Z]([A-Z]([0-9][0-9])?)?)?)[0-9] | 20 / 36 | sûr |
| Wikidata P267 (contrainte de format) — bonne liste de lettres et bons niveaux, mais sans ancres : « xA10BA02x » passe | [ABCDGHJLMNPRSV]([0-9][0-9]([A-Z]([A-Z]([0-9][0-9])?)?)?)? | 21 / 36 | sûr |
Implémentation
const re = new RegExp("^[ABCDGHJLMNPRSV](?:[0-9]{2}(?:[A-Z](?:[A-Z](?:[0-9]{2})?)?)?)?$", "");
re.test(input);Limites
- Valide seulement la FORME : un code correct du point de vue des lettres et des chiffres peut ne pas exister dans l'index de l'OMS (« A99ZZ99 » passe). L'existence se vérifie dans l'ATC/DDD Index, mis à jour chaque année.
- Codes vétérinaires ATCvet (préfixe Q, par exemple QA07AA90) refusés : ils relèvent d'un autre index. Les niveaux 2, 3 et 4 sont acceptés (« N02 », « N02B », « N02BE ») ; la longueur de 2 ou 6 caractères est refusée.
- Ne dit rien des codes de combinaison ni des doses (DDD) ; les codes d'un même principe actif peuvent changer d'une année à l'autre.