Étant donné une valeur, je veux la valider pour vérifier si c'est une année valide. Mes critères sont simples où la valeur doit être un entier avec des 4
caractères. Je sais que ce n'est pas la meilleure solution car elle ne permettra pas des années auparavant 1000
et permettra des années comme 5000
. Ce critère est adéquat pour mon scénario actuel.
Ce que j'ai trouvé 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?
regex
string
validation
string-matching
Ranhiru Jude Cooray
la source
la source
Réponses:
Vous devez ajouter une ancre de départ
^
comme:^\d{4}$
Votre expression régulière
\d{4}$
correspondra aux chaînes qui se terminent par 4 chiffres . Donc, les entrées comme-1234
seront acceptées.En ajoutant l'ancre de début, vous ne faites correspondre que les chaînes qui commencent et se terminent par 4 chiffres, ce qui signifie qu'elles ne doivent contenir que 4 chiffres.
la source
whateverblahblah2323
. Maintenant je comprends pourquoi un peu d'apprentissage est dangereux: O10000
serait un bug.Années de 1000 à 2999
^[12][0-9]{3}$
Pour 1900-2099
^(19|20)\d{2}$
la source
^(?:19|20)\d{2}$
(19|20)\d{2}
à mon regex afin de valider un format de date de naissance? Ceci est mon expression régulière/^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/
Je veux m'assurer que l'année a toujours 4 chiffres et commence par 19 ** ou 20 **La réponse «acceptée» à cette question est à la fois incorrecte et myope.
Il est incorrect en ce sens qu'il correspondra à des chaînes comme
0001
, qui n'est pas une année valide.Il est myope en ce sens qu'il ne correspondra à aucune valeur supérieure à 9999. Avons-nous déjà oublié les leçons de l' an 2000 ? À la place, utilisez l'expression régulière:
^[1-9]\d{3,}$
Si vous avez besoin de faire correspondre des années dans le passé, en plus des années dans le futur, 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 voudrez peut-être utiliser cette expression régulière de toute façon, juste au cas où quelqu'un inventerait une machine à remonter le temps et voudrait ramener votre logiciel avec lui.
Remarque: Cette expression régulière correspondra à toutes les années, y compris celles antérieures à l'année 1, car elles sont généralement représentées avec une désignation BC au lieu d'un entier négatif. Bien sûr, cette convention pourrait changer au cours des prochains millénaires, la meilleure option est donc de faire correspondre tout entier (positif ou négatif) avec l'expression régulière suivante:
^-?[1-9]\d*$
la source
Cela fonctionne de 1900 à 2099:
/(?:(?:19|20)[0-9]{2})/
la source
S'appuyant sur la réponse @ r92, pour les années 1970-2019:
(19[789]\d|20[01]\d)
la source
197999
19[789]\d\d\d
permettrait197999
/(19[789]\d|20[01]\d)/.test(1970324) >> true
1970
), pas aux 3 derniers. Et(19[789]\d|20[01]\d)[^0-9]
? Cela correspondrait1970 324
mais pas1970324
En théorie, l'option à 4 chiffres est correcte. Mais en pratique, il serait peut-être préférable d'avoir une plage de 1900 à 2099.
De plus, il doit s'agir d'un groupe non capturant. De nombreux commentaires et réponses proposent de capturer un regroupement qui n'est pas approprié à mon humble avis. Parce que pour la correspondance, cela peut fonctionner, mais pour extraire des correspondances à l'aide de regex, il extraira 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 non capturants:
(?:19|20)\d{2}
la source
vous pouvez utiliser qc comme [
^-]\d{4}$
: vous évitez que le signe moins-
soit avant vos 4 chiffres.vous pouvez également utiliser
^\d{4}$
avec^
pour attraper le début de la chaîne. Cela dépend de votre scénario en fait ...la source
Pour tester une année dans une chaîne qui contient d'autres mots avec l'année, vous pouvez utiliser l'expression régulière suivante: \ b \ d {4} \ b
la source
Utilisation;
^(19|[2-9][0-9])\d{2}$
pour les années 1900 - 9999.
Pas besoin de s'inquiéter pour 9999 et après - AI fera alors toute la programmation !!! Hehehehe
Vous pouvez tester votre regex sur https://regex101.com/
Plus d'informations sur les groupes non capturants (mentionnés dans l'un des commentaires ci-dessus) ici http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm
la source
Vous pouvez convertir votre entier en une chaîne. Comme le signe moins ne correspondra pas aux chiffres, vous n'aurez aucune année négative.
la source
J'utilise cette regex en Java
^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$
Œuvres de 1900 à 9999
la source
/ ^ \ d {4} $ / Ceci vérifiera si une chaîne se compose de seulement 4 nombres. Dans ce scénario, pour entrer une année 989, vous pouvez donner 0989 à la place.
la source
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})$
la source
Vous pouvez également utiliser celui-ci.
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
la source
00/00/2000
ou31/02/1999
et bien d'autres fausses dates.(0[1-9]|1[0-2])
est une bien meilleure expression pour le mois