Rexact
Cheatsheet

Regex identifiant arXiv

arXiv documente deux schémas. Depuis avril 2007 : YYMM.NNNN (4 chiffres jusqu'en décembre 2014) puis YYMM.NNNNN (5 chiffres depuis janvier 2015). Avant : archive[.CL]/YYMMNNN (3 chiffres de séquence, de juillet 1991 à mars 2007). Une version « vN » peut suivre. Les tentatives relues sont soit trop floues (le motif de bioregistry accepte « 1234 » seul, l'expression de Wikidata laisse un point non échappé et n'est pas ancrée), soit limitées à un schéma (celles du dépôt arxiv-base ne traitent qu'un schéma chacune et acceptent « 0000.0000 » ou un mois 00). Voici un motif qui lie le nombre de chiffres à la période, comparé à ces tentatives.

/^(?:(?:07(?:0[4-9]|1[0-2])|(?:0[89]|1[0-4])(?:0[1-9]|1[0-2]))\.[0-9]{4}|(?:1[5-9]|[2-9][0-9])(?:0[1-9]|1[0-2])\.[0-9]{5}|[a-z]+(?:-[a-z]+)?(?:\.[A-Za-z-]{2,})?/(?:91(?:0[7-9]|1[0-2])|(?:9[2-9]|0[0-6])(?:0[1-9]|1[0-2])|070[1-3])[0-9]{3})(?:v[1-9][0-9]*)?$/
passe 32/32 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
Wikidata P818 — non ancrée, point non échappé (« 1706x03762 » passe), mois et nombre de chiffres non bornés(\d{4}.\d{4,5}|[a-z\-]+(\.[A-Z]{2})?\/\d{7})(v\d+)?19 / 32vulnérable (------------------------------------------------------------…)
bioregistry / identifiers.org — très lâche : « 1234 » ou « abc1234 » passent, mois et période non contrôlés^(\w+(\-\w+)?(\.\w+)?\/?)?\d{4,7}(\.\d+(v\d+)?)?$17 / 32sûr
arxiv-base RE_ARXIV_NEW_ID — nouveau schéma seulement ; mois 00 et 4/5 chiffres non liés à la date ; accepte un suffixe « #… » ou « /… »^(?<yymm>(?<yy>\d\d)(?<mm>\d\d))\.(?<num>\d{4,5})(v(?<version>[1-9]\d*))?(?<extra>[#\/].*)?$20 / 32sûr
arxiv-base RE_ARXIV_OLD_ID — ancien schéma seulement ; mois et période non bornés ; accepte un suffixe « #… » ou « /… »^(?<archive>[a-z]{1,}(\-[a-z]{2,})?)(\.([a-zA-Z\-]{2,}))?\/(?<yymm>(?<yy>\d\d)(?<mm>\d\d))(?<num>\d\d\d)(v(?<version>[1-9]\d*))?(?<extra>[#\/].*)?$23 / 32sûr

Implémentation

const re = new RegExp("^(?:(?:07(?:0[4-9]|1[0-2])|(?:0[89]|1[0-4])(?:0[1-9]|1[0-2]))\\.[0-9]{4}|(?:1[5-9]|[2-9][0-9])(?:0[1-9]|1[0-2])\\.[0-9]{5}|[a-z]+(?:-[a-z]+)?(?:\\.[A-Za-z-]{2,})?/(?:91(?:0[7-9]|1[0-2])|(?:9[2-9]|0[0-6])(?:0[1-9]|1[0-2])|070[1-3])[0-9]{3})(?:v[1-9][0-9]*)?$", "");
re.test(input);

Limites

  • Valide seulement la FORME et la période (4 chiffres de 0704 à 1412, 5 chiffres depuis 1501) : ni l'existence du preprint ni le numéro de séquence maximal du mois ne sont vérifiés. Le préfixe « arXiv: » et les URL sont refusés : normalisez avant.
  • Pour l'ancien schéma, le motif accepte toute archive de lettres minuscules (avec un tiret) et toute classe thématique de lettres ou tirets ; il ne connaît pas la liste des archives (celle d'arxiv-base). Les suffixes de page « #… » sont refusés.
  • La borne haute de l'année n'est pas contrôlée au-delà de 99 (le schéma officiel parle de 2099, voire 2106).

Pages liées