É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?
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.
Années de 1000 à 2999
^[12][0-9]{3}$
Pour 1900-2099
^(19|20)\d{2}$
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*$
Cela fonctionne pour 1900 à 2099:
/(?:(?:19|20)[0-9]{2})/
En s'appuyant sur la réponse @ r92, pour les années 1970-2019:
(19[789]\d|20[01]\d)
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}
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
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
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 ...
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
Vous pouvez également utiliser celui-ci.
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
/^\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.
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.
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})$