2009-07-26 7 views
0

J'ai besoin d'une regex qui limite une entrée d'heure de 0-24 avec la fraction en multiples de 0,25. S'il vous plaît garder à l'esprit les conditions suivantes doivent être remplies:Regex permettant des heures en incréments de 15 minutes

  • Lorsqu'une partie entière est 0-23, la partie décimale peut être .0, .25, 0,5 ou .75
  • Lorsqu'une partie entière est 24 , la partie décimale peut être .0
  • Si aucune partie entière est présente, la partie décimale doit être .0, .25, 0,5 ou .75
  • chaîne ne peut être vide

I Je suis très confiant que l'expression suivante peut être resserrée, mais c'est ce que CE jusqu'ici:

(^(([0-9])|(1[0-9])|(2[0-3]))(\.((0*)|(250*)|(50*)|(750*)))?$)|(^24(\.0*)?$)|(^\.((0+)|(250*)|(50*)|(750*))$) 

Mise à jour: La validation regex existe à la fois sur le client (javascript) et le serveur (asp.net, C#).

+0

Il ne semble pas logique d'autoriser 24,0 aussi bien que 0,0, car ils sont en même temps. – caf

+0

@caf: sauf si vous enregistrez des durées plutôt que des durées. Un système d'inscription d'une heure par jour ou quelque chose. J'espère sincèrement que personne n'aura jamais besoin d'utiliser l'option "24", bien que :) – Thorarin

+0

Bien sûr, mais une réservation de 0.0 longueur semble un peu louche alors. – caf

Répondre

11

Et la raison pour laquelle vous avez absolument, positivement besoin de le faire comme une expression régulière est pourquoi? Convertir en nombre et faire quelques vérifications de base serait beaucoup plus facile.

Vérifiez si le nombre multiplié par 4 est un nombre naturel < = 96, done.

À en juger par votre profil, vous utilisez probablement .NET. Je suppose que vous voulez cela comme une expression régulière parce que vous l'utilisez pour la validation côté client. J'envisagerais sérieusement d'utiliser un CustomValidator avec un JavaScript côté client.

Quelque chose le long de ces lignes pour le JavaScript:

<script type="text/javascript"> 
function checkDuration(text) 
{ 
    var tmp = parseFloat(text) * 4; 
    return tmp >= 0 && tmp <= 96 && Math.ceil(tmp) == tmp; 
} 
</script> 

Edit: Je suis un peu inquiet au sujet des erreurs d'arrondi lors de l'utilisation des flotteurs, mais il semble fonctionner bien pour tous les cas possibles.

+0

+1: Oui, même s'il cherchait un nombre correspondant aux critères d'une chaîne (ce qui n'est pas le cas, à en juger par les ancres), il serait préférable de simplement faire correspondre les nombres et faire la validation dans une fonction de rappel . – Blixt

+0

@Thorarin - Bonne idée. Pour répondre à votre question, Regex m'a semblé une option raisonnable. La validation existe à la fois sur le client (javascript) et sur le serveur (asp.net, C#). Merci. –

+0

Bonne chose que j'écrivais une implémentation JavaScript que vous pouvez adapter pour votre CustomValidator alors :) – Thorarin

4
^((1?\d|2[0-3])?(\.(0|[27]?5)0*)|(1?\d|2[0-4])(\.0*)?)$ 
+0

+1 pour effort. J'aime mieux celui-ci car il n'utilise pas l'assertion lookbehind.Facilite la lecture et la compatibilité syntaxique avec davantage d'implémentations regex. – Thorarin

+0

+1 - Bien fait, c'est beaucoup mieux que ma tentative. Je vais supprimer le mien en faveur de cela. – Tomalak

Questions connexes