Regex DOI (Digital Object Identifier)
A DOI isn't just "10. followed by anything": Crossref, the leading registration agency for scientific literature, itself publishes a reference regex - one that covers 74.4 million of the 74.9 million DOIs it observes. An npm package loosens the prefix's digit count to as few as 2 instead of 4-9, accepting prefixes that were never actually assigned. A 2009 blog post freezes the prefix at exactly 4 digits - its own author admits a 2.5% failure rate right at publication, on just 40 tested articles. Here's the regex Crossref itself recommends, compared against these three attempts.
/^10\.\d{4,9}/[-._;()/:A-Z0-9]+$/ipasses 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | undetermined |
| 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 | vulnerable (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 | undetermined |
Implementation
const re = new RegExp("^10\\.\\d{4,9}/[-._;()/:A-Z0-9]+$", "i");
re.test(input);Limits
- 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.