Regex DOI (Digital Object Identifier)
Un DOI, ce n'est pas juste « 10. suivi de n'importe quoi » : Crossref, la principale agence d'enregistrement pour la littérature scientifique, publie elle-même une regex de référence — qui couvre 74,4 millions de DOI sur les 74,9 millions qu'elle observe. Un package npm assouplit le nombre de chiffres du préfixe à seulement 2 au lieu de 4 à 9, acceptant des préfixes qui n'ont jamais été attribués. Un article de blog de 2009, lui, fige le préfixe à exactement 4 chiffres — son propre auteur avoue un taux d'échec de 2,5% dès la publication, sur seulement 40 articles testés. Voici la regex que Crossref recommande elle-même, comparée à ces trois tentatives.
/^10\.\d{4,9}/[-._;()/:A-Z0-9]+$/ipasse 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| npm/GitHub regexhq/doi-regex — nombre de chiffres du préfixe assoupli à un minimum de 2 au lieu de 4-9, acceptant des préfixes jamais réellement attribués (« 10.12/x ») | (10[.][0-9]{2,}(?:[.][0-9]+)*/(?:(?![%"#? ])\S)+) | 13 / 20 | indéterminé |
| Blog Doei Doei (2009) — préfixe figé à exactement 4 chiffres (échoue sur les préfixes à 5-9 chiffres, courants aujourd'hui) et dépend de la présence littérale du mot « doi » juste avant l'identifiant | [doi|DOI][\s\.\:]{0,2}(10\.\d{4}[\d\:\.\-\/a-z]+)[A-Z\s] | 14 / 20 | vulnérable (d10.22222d10.22222d10.22222d10.22222d10.22222d10.22222d10.22…) |
| Bibliothèque Python python-doi — conçue pour EXTRAIRE un DOI candidat après le mot-clé « doi », pas pour en valider la forme : un DOI nu sans ce contexte textuel n'est jamais reconnu | doi(.org)?\s*(=|:|/|\()\s*("|')?(?<doi>[^"\s%$^'<>@,;:#?&]+)("|'|\))? | 12 / 20 | indéterminé |
Implémentation
const re = new RegExp("^10\\.\\d{4,9}/[-._;()/:A-Z0-9]+$", "i");
re.test(input);Limites
- Valide seulement la FORME (préfixe 10.NNNN-NNNNNNNNN + suffixe) : ne consulte pas l'API officielle de résolution (doi.org/api/handles/) qui seule confirme qu'un DOI est réellement enregistré et actif.
- Par la propre estimation de Crossref, ce motif couvre 74,4 des 74,9 millions de DOI observés (environ 99,3%) : certains DOI historiques antérieurs à des conventions plus strictes, ainsi qu'un sous-ensemble notable du registrant Wiley (préfixe 10.1002), peuvent y échapper — Crossref propose un second motif complémentaire spécifique à ce cas.
- Capture parfois de la ponctuation de phrase collée au DOI lors d'une extraction depuis du texte libre (un point final, des deux-points) : Crossref le signale lui-même comme limite connue de son propre motif recommandé.
- Le suffixe peut en théorie contenir presque n'importe quel caractère Unicode imprimable et n'a aucune longueur maximale définie par la norme : ce motif se limite à la classe de caractères la plus courante en pratique, sans prétendre couvrir 100% des suffixes valides possibles.