2010-09-23 3 views
1

Je suis en train d'utiliser l'expression régulière suivante pour valider une date en javascript (désolé, il est un peu une brute):non terminée erreur Parenthetical avec une expression régulière en Javascript

"/^(((0[1-9]|[12][0-9]|3[01])\/(0[13578]|1[02])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|[12][0-9]|30)\/(0[13456789]|1[012])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|1[0-9]|2[0-8])\/02\/((19|[2-9][0-9])[0-9]{2}))|(29\/02\/((1[6-9]|[2-9][0-9])(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/" 

Le problème est, je Obtenir une erreur JavaScript Parenthetical non terminée. J'ai essayé d'utiliser cette expression en PHP avec preg_match et ça marche bien. Un peu perplexe, toute aide serait grandement appréciée! Editer: Je devrais ajouter, la date que j'essaye de valider serait dans un format de jj/mm/aaaa.

Édition 2: Désolé, j'aurais dû préciser que j'utilise le validateur jQuery de position-abolute.com (http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/).
La règle personnalisée que je l'ai défini est:

"date":{ 
    "regex":"/^(((0[1-9]|[12][0-9]|3[01])\/(0[13578]|1[02])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|[12][0-9]|30)\/(0[13456789]|1[012])\/((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|1[0-9]|2[0-8])\/02\/((19|[2-9][0-9])[0-9]{2}))|(29\/02\/((1[6-9]|[2-9][0-9])(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/", 
    "alertText":"* Invalid date, must be in DD/MM/YYYY format."} 
+0

Pourriez-vous nous montrer le code que vous utilisez pour la validation? –

+0

Fonctionne pour moi ... –

+0

Cela n'aurait-il pas plus de sens de créer une date à partir des composants et de voir qu'elle renvoie la même valeur lorsqu'elle est lue? –

Répondre

1

Pas d'erreur dans Firebug. Aussi regexplanet.com compile cette amende (une fois les barres obliques supprimées). Cependant, 21 groupes de capture - surtout s'ils sont imbriqués - ne sont pas l'approche idéale en JavaScript. L'analyse des matchs sera un cauchemar. Ma suggestion serait d'essayer de décomposer votre expression rationnelle en parties si possible.

0

soit l'utilisation/MyRegex/ou une nouvelle RegExp (« myRegex »)

+0

Le plugin de validation prend apparemment une chaîne. – FK82

+0

bien qu'il n'a pas fait remarquer qu'il utilise un plugin de validation jusqu'à récemment. Mais toujours // ou "" les deux sont complètement faux. –

0

Le regex semble bon parenthétique sage, mais je vous suggère d'utiliser des groupes non-capture (?) Où vous n'avez pas besoin de saisir quoi que ce soit. De plus, si vous ne savez pas, vous pouvez vérifier http://www.regular-expressions.info/ pour plus d'informations.

1

Merci à tous pour vos réponses. Je sais que l'utilisation d'une telle regex convulatoire n'est pas idéale, mais je travaille sur un système existant et je voulais maintenir des méthodes de validation cohérentes. Quoi qu'il en soit, la chaîne regex était en train d'être extraite par une autre méthode avant d'être évaluée, ce qui supprimait les caractères '\' qui s'échappaient ('/' devenait '/').

La solution la plus rapide à laquelle je pouvais penser était de remplacer '/' par '[/]', car la barre oblique perd sa signification particulière dans le jeu de caractères. La regex ressemble maintenant à:

/^(((0[1-9]|[12][0-9]|3[01])[/](0[13578]|1[02])[/]((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|[12][0-9]|30)[/](0[13456789]|1[012])[/]((19|[2-9][0-9])[0-9]{2}))|((0[1-9]|1[0-9]|2[0-8])[/]02[/]((19|[2-9][0-9])[0-9]{2}))|(29[/]02[/]((1[6-9]|[2-9][0-9])(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/ 

Espérons que cela a du sens et merci encore!

+1

Double échappement ('\\ /') ne le fera pas? Autre que cela, à partir de votre montage, j'ai compris que vous voulez valider une date de certains formats spécifiques. Dans ce cas, je pense que vous pourriez être en mesure de simplifier votre affaire. – FK82

+0

Vous avez raison, la double évasion est une meilleure solution. Je ne sais pas pourquoi je n'y avais pas pensé avant le jeu de caractères: S – Jonathan

Questions connexes