web-dev-qa-db-fra.com

Correspondance d'expression régulière à tester pour une année valide

Étant donné une valeur, je veux le valider pour vérifier s'il s'agit d'une année valide. Mon critère est simple où la valeur doit être un entier avec 4 caractères. Je sais que ce n’est pas la meilleure solution car cela ne permettra pas des années avant 1000 et des années comme 5000 Ce critère est adéquat pour mon scénario actuel.

Ce que je suis venu avec est

\d{4}$

Bien que cela fonctionne, cela permet également des valeurs négatives.

Comment puis-je m'assurer que seuls les entiers positifs sont autorisés?

65
Ranhiru Cooray

Vous devez ajouter une ancre de début ^ en tant que:

^\d{4}$

Votre regex \d{4}$ correspondra aux chaînes qui se terminent par 4 chiffres . Donc, une saisie telle que -1234 sera acceptée.

En ajoutant l'ancre de départ, vous ne faites correspondre que les chaînes qui commencent et finissent avec 4 chiffres, ce qui signifie qu'elles ne doivent contenir que 4 chiffres.

63
codaddict

Années de 1000 à 2999

^[12][0-9]{3}$

Pour 1900-2099

^(19|20)\d{2}$
138
r92

La réponse "acceptée" à cette question est à la fois incorrecte et myope.

Il est incorrect dans la mesure où il fera correspondre des chaînes telles que 0001, qui n'est pas une année valide.

C'est myope en ce sens que pas ne correspond à aucune valeur supérieure à 9999. Avons-nous déjà oublié les leçons de Y2K ? Au lieu de cela, utilisez l'expression régulière:

^[1-9]\d{3,}$

Si vous avez besoin de faire correspondre les années passées, en plus des années futures, vous pouvez utiliser cette expression régulière pour faire correspondre tout entier positif:

^[1-9]\d*$

Même si vous ne vous attendez pas à des dates du passé, vous pouvez quand même utiliser cette expression régulière, juste au cas où quelqu'un inventerait une machine à remonter le temps et voudrait ramener votre logiciel avec elle.

Remarque: Cette expression régulière correspond à toutes les années, y compris celles précédant l'année 1, car elles sont généralement représentées par une désignation de la Colombie-Britannique au lieu d'un entier négatif. Bien entendu, cette convention peut changer au cours des prochains millénaires. La meilleure solution consiste donc à associer tout nombre entier positif ou négatif à l'expression régulière suivante:

^-?[1-9]\d*$
21
sferik

Cela fonctionne pour 1900 à 2099:

/(?:(?:19|20)[0-9]{2})/
9
jonschlinkert

En s'appuyant sur la réponse @ r92, pour les années 1970-2019:

(19[789]\d|20[01]\d)
4
Renaud

En théorie, l'option à 4 chiffres est la bonne. Mais dans la pratique, il serait peut-être préférable d'avoir une plage 1900-2099.

De plus, il doit s'agir d'un groupe non capturant. De nombreux commentaires et réponses proposent de capturer un groupe qui n'est pas le bon IMHO. Parce que pour faire correspondre cela pourrait fonctionner, mais pour extraire des correspondances en utilisant regex, il va extraire des nombres à 4 chiffres et des nombres à deux chiffres (19 et 20) également à cause de la paranthèse.

Cela fonctionnera pour une correspondance exacte en utilisant des groupes sans capture:

(?:19|20)\d{2}

1
Adil Aliyev

Pour tester une année dans une chaîne contenant d'autres mots, vous pouvez utiliser l'expression régulière suivante:\b\d {4}\b

1
Dhyey

Utilisation;

^(19|[2-9][0-9])\d{2}$ 

pour les années 1900 - 9999.

Pas besoin de s'inquiéter à partir de 9999 - A.I. fera toute la programmation d'ici là !!! Hehehehe

Vous pouvez tester votre regex à https://regex101.com/

Aussi, plus d’informations sur les groupes sans capture (mentionnées dans l’un des commentaires ci-dessus) ici http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm

1
MarcoZen

vous pouvez utiliser sth comme [^-]\d{4}$: vous évitez que le signe moins - soit avant vos 4 chiffres.
vous pouvez également utiliser ^\d{4}$ avec ^ pour intercepter le début de la chaîne. Cela dépend de votre scénario en fait ...

1
PierrOz

J'utilise cette expression rationnelle en Java ^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$

Travaux de 1900 à 9999

0
R2Rivs

Vous pouvez également utiliser celui-ci.

([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
0
Ranjeet Luhar

/^\d {4} $/ Ceci vérifiera si une chaîne ne contient que 4 chiffres Dans ce scénario, pour saisir une année 989, vous pouvez utiliser plutôt 0989.

0
Dayz

Vous pouvez convertir votre entier en chaîne. Comme le signe moins ne correspond pas aux chiffres, vous n'aurez pas d'années négatives.

0
Comradin

Si vous devez faire correspondre AAAA ou AAAAMMJJ, vous pouvez utiliser:

^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$
0
Benjamin Goodacre