Expression régulière correspondant à un jour de validité d'une date
J'ai besoin d'aide venir avec une expression régulière pour s'assurer que l'utilisateur entre une date valide
La chaîne sera dans le format de mm/dd/yyyy
Voici ce que j'ai mis au point jusqu'à présent.
/\[1-9]|0[1-9]|1[0-2]\/\d{1,2}\/19|20\d\d/
J'ai validé les regex où l'utilisateur ne peut pas entrer un jour de plus de 12 et les années ont commencer par "19" ou 20". Ce que j'ai de la difficulté est de trouver une certaine logique pour la validation de la journée. La journée ne devrait pas aller plus 31.
Une regex semble comme un étrange outil pour résoudre ce problème. Pouvez-vous ne pas convertir le texte à une date et à une vérification de ses valeurs?
Bien que ce principe pourrait être fait, une regex qui a géré le bon nombre de jours pour chaque mois (y compris les années bissextiles) serait incroyablement complexe. Pourquoi ne pas simplement diviser la date et de tester chaque composant? (Ou, mieux encore, utiliser l'un des nombreux date analyseurs sur le CPAN.)
pourquoi demandez-vous la même question qu'il y a un an??? questions/2573466/matching-a-date-in-perl. OK, il y a un an vous n'avez pas obtenu un regex réponse, mais j'espère vous voir à partir de @Seth réponse regex n'est pas utile de valider une date.
Si je voulais que toutes les conditions telles que l'année bissextile, alors je l'ai dit donc
mon point est simplement que la plupart des gens commencent à penser qu'ils ont juste besoin d'un simple regex pour une chaîne de date, mais finissent par avoir besoin de quelque chose de "réel". Si ce n'est pas le cas pour vous, pas de problème 🙂 Si c'est, eh bien, ma réponse sera toujours là quand vous en avez besoin!
Bien que ce principe pourrait être fait, une regex qui a géré le bon nombre de jours pour chaque mois (y compris les années bissextiles) serait incroyablement complexe. Pourquoi ne pas simplement diviser la date et de tester chaque composant? (Ou, mieux encore, utiliser l'un des nombreux date analyseurs sur le CPAN.)
pourquoi demandez-vous la même question qu'il y a un an??? questions/2573466/matching-a-date-in-perl. OK, il y a un an vous n'avez pas obtenu un regex réponse, mais j'espère vous voir à partir de @Seth réponse regex n'est pas utile de valider une date.
Si je voulais que toutes les conditions telles que l'année bissextile, alors je l'ai dit donc
mon point est simplement que la plupart des gens commencent à penser qu'ils ont juste besoin d'un simple regex pour une chaîne de date, mais finissent par avoir besoin de quelque chose de "réel". Si ce n'est pas le cas pour vous, pas de problème 🙂 Si c'est, eh bien, ma réponse sera toujours là quand vous en avez besoin!
OriginalL'auteur Zerobu | 2011-05-20
Vous devez vous connecter pour publier un commentaire.
Regex pour 0-31:
Ou si vous ne voulez pas jours avec un précédent de zéro (par ex. 05):
C'est parce que la date ne sera pas forcément valable. Il n'est pas, par exemple, de rejeter 31 février 2011. Regex le mauvais outil pour cela.
a été 1974, une année bissextile? qu'en 2000?
Ne serait-ce pas permettre à une valeur de '00'?
Ceci ne permettait pas de jours se terminant par un zéro -- "10" ou 20".
OriginalL'auteur bluepnume
D'autres solutions sont beaux, probablement de travail, etc. Habituellement, vous avez envie de faire un peu plus, et puis un peu plus, et finalement, vous avez quelques fous de code, et des années bissextiles, et pourquoi le faites-vous vous-même à nouveau?
DateTime et ses formateurs sont votre solution. Utilisez-les! Parfois, ils sont un peu exagéré, mais bien souvent cela fonctionne pour vous en bas de la route.
$foo
est maintenant un objet DateTime. Profitez de.Si votre chaîne de date n'est pas correctement formaté,
$foo
sera"undef"
et$dayFormat->errstr
vais vous dire pourquoi.OriginalL'auteur Ryley
01-31
puis RegEx est très bien aussi longtemps que il ya quelques backend logique qui valide la date dans son ensemble, si vous le souhaitez.Je vois la réponse attendue actuellement échoue pour 10, 20.
gawk 'BEGIN{ for(i=0;i<=32;i++){ if (i ~ /^([0-2]?[1-9]|3[01])$/){print i " yes"}else {print i " no"} } }
^([0-2]?[1-9]|3[01]|10|20)$
Donc de bien vouloir examiner ci-dessous la solution...
1. Identifier les ensembles qui doivent être appariés:
{01,...,09},{10,...,31}
{10,...,31}
peut être divisé en=> {10,...,29},{30,31}
{1,...,31} => {1,...,9},{10,...,31}
2. Correspondant à des expressions régulières pour chaque sous-ensemble:
Maintenant, nous pouvons le groupe
([0][1-9])
et([1-9])
ensemble comme([0]?[1-9])
. Où?
signifie 0 ou 1 occurrence du motif symbole/. [Mise à JOUR] - Merci @MattFrear pour le pointage.De sorte que le montant de la RegEx est:
^(([0]?[1-9])|([1-2][0-9])|(3[01]))$
Testé ici: http://regexr.com/?383k1 [mise à JOUR]
Une amélioration par rapport à la accepté de répondre. Cependant, cela va accepter 001, 00000001, etc. Je suggère ^(([0]?[1-9])|([1-2][0-9])|(3[01]))$ regexr.com?383k1
Oui bonne prise! J'ai fait une erreur tout en combinant
([0][1-9])
et([1-9])
ensemble comme([0]*[1-9])
... alors qu'elle devrait clairement être([0]?[1-9])
. Merci pour le partage du cas de test.OriginalL'auteur Kent Pawar
De Expressions dans la catégorie: les Dates et horaires
Valide le nombre exact de jours dans un mois, on dirait qu'il gère même les années bissextiles.
Vous pouvez bien sûr changer
[\.\-/]
avec/
pour autoriser uniquement les barres obliques.OriginalL'auteur Seth Robertson
Ce n'est pas tous les que dur...
OriginalL'auteur ysth
Essayer:
/(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/((19|20)\d\d)/
OriginalL'auteur fvox
Est l'expression régulière? Si non, vous feriez mieux d'utiliser une approche différente, comme
DateTime::Format::DateManip
OriginalL'auteur snoofkin
Regex pour 0-31 jour:
0[1-9]|[12]\d|3[01]) sans préfixe 0 - lorsque "1", "23"...
([1-9]|[12]\d|3[01]) avec le préfixe 0 - lorsque "01", "04"
(0?[1-9]|[12]\d|3[01]) - avec ou sans le "0" -""
OriginalL'auteur RomanV