Expression régulière pour détecter une année dans une phrase

Besoin d'aide pour détecter le cas le plus simple

a marqué ce sujet comme résolu.

Salut ! :)

Je cherche à écrire une expression régulière qui détecte si une année 2000 (exemple : 2021) est présente dans une phrase. Un nombre qui ne serait pas une année à 4 chiffres (exemples : 20210, 201) ne doit pas être détecté. Voici quelques exemples :

Chaîne de caractère La regex doit renvoyer
2021 true
Nous sommes en 2021 ! true
J’en suis sûr à 200% ! false
Le nombre 20399 est premier. false

Le code

Ci-dessous se trouve mon code actuel.
Vous pouvez tester ce code directement dans la console :

let reg;

reg = /20[0-9]{2}[^0-9]/;

// On teste les exemples, les résultats s'affichent dans la console
reg.test("2021");                           // false
reg.test("Nous sommes en 2021 !");           // true
reg.test("J’en suis sûr à 200% !");          // false
reg.test("Le nombre 20399 est premier.");   // false

Le problème

Mon code arrive à détecter correctement les trois derniers exemples. Il a du mal avec la chaîne "2021" car il n’y a aucun caractère après l’année. Si j’écris /20[0-9]{2}[^0-9]?/, alors il détecte bien le premier cas mais il retourne true pour le dernier cas.

Auriez-vous une piste pour que la regex coïncide avec les exemples du tableau ? :euh:
J’avoue que je sèche un peu…

+0 -0

Salut,

Il faut utiliser un negative lookahead pour dire "je veux matcher seulement si il n’y a pas un chiffre qui suit": /20\d{2}(?!\d)/.

Note qu’en l’état, tu vas matcher "32021" par exemple, il faut donc aussi un negative lookbehind ce qui donne :

/(?<!\d)20\d{2}(?!\d)/

On voit rapidement que c’est pas terrible question lisibilité est maintenabilité. Les regex ne sont pas un outil très approprié pour ce genre de problèmes. Tu pourrais avoir intérêt à matcher et capturer tous les nombres \d+ et vérifier que leur valeur est entre 2000 et 2099.

PS : "la console" sans autre précision, c’est plutôt le shell que la console JS du navigateur… Un tag "JS" serait bienvenu…

PPS : quid de "2021.5" par exemple ? C’est un match en l’état. C’est un problème ou tu t’en fous ? Même problème avec "5.2021"… Ou encore "2021e3".

+3 -0

Une bien meilleur solution serait d’utiliser un délimiteur de mot (\b): /\b20\d{2}\b/. Ça permet de gérer l’année au début ou à la fin de ton entrée et va aussi gérer le cas de "2021e3" proposé par @adri1. Par contre, "2021.5" va quand même matcher 2021.

Fondamentalement, /\b20\d{2}\b/ est équivalent à /(^|[^a-zA-Z0-9_])20\d{2}([^a-zA-Z0-9_]|$)/ dans ce contexte.

Merci pour vos différentes réponses, je n’ai pas encore eu le temps d’y réfléchir plus longuement mais comme indiqué par @adri1, je pense matcher et capturer tous les nombres dans la phrase et vérifier leur valeur.

En plus d’être plus lisible et maintenable, cela me permettra d’être plus précis car les dates après 2021 ne sont pas pertinentes pour ce que je souhaite faire. Je ne sais pas encore si des entrées comme "5.2021" ou "year2021" sont acceptables, je dois encore y réfléchir.

En attendant, passez une bonne soirée !
PS : ajout du tag JS au topic

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte