2009-09-03 5 views
0

Je cette expression régulière qui correspond aux chaînes suivantes:Aide en simplifiant ce modèle d'expression régulière

<!-- 09-02-2009 ---> 
<!-- 09-02-2009 12:00:00 ---> 
<!-- 09-02-2009 12:00:00 A ---> 
<!-- 09-02-2009 12:00:00 AM ---> 

Voici le schéma:

<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?:(?: ?\d{2}:?){3}?(?: ?[aApP][mM]?)?)? ---> 

modèle mis à jour, par twistol:

<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?<time>(?: ?(?:\d{2}:){2}\d{2})?(?: ?[aApP][mM]?)?)? ---> 

Y at-il quelque chose que je peux faire pour simplifier cette pa ttern?

Merci!

EDIT

Voici le modèle que je suis venu avec tous les commentaires/réponses, ainsi que la validation intégrée. Il est un peu laid, mais qui a dit regex doit être assez? : P

<!-- (?<month>(?:0[1-9]|1[0-2]))-(?<day>(?:0[1-9]|1[0-9]|2[0-9]|3[01]))-(?<year>\d{4})(?<time> (?:0[0-9]|1[0-9]|2[0-3]):(?:[0-5][0-9])(?::[0-5][0-9])?(?: [aApP][mM]?)?)? ---> 

il correspondra à des dates valides dans les formats suivants:

<!-- 09-02-2009 ---> 
<!-- 09-02-2009 12:00 ---> 
<!-- 09-02-2009 12:00 A ---> 
<!-- 09-02-2009 12:00 AM ---> 
<!-- 09-02-2009 12:00:00 ---> 
<!-- 09-02-2009 12:00:00 A ---> 
<!-- 09-02-2009 12:00:00 AM ---> 
+1

Cela dépend de ce que la saveur de regex que vous utilisez. Perl, JS, etc – pavium

+1

ne peut pas dire que je peux aider à le simplifier, mais ce bit ne correspondrait pas aussi "11:11:11:" (notez le supplément :)? '(?:? \ d {2}:?) {3}?' – Twisol

+0

Désolé je n'ai pas spécifié, je l'utilise dans un projet C#. – Anders

Répondre

3
<!-- (?<month>\d\d)-(?<day>\d\d)-(?<year>\d{4})(?: \d\d:\d\d:\d\d(?: [aApP][mM]?)?)? --> 

est aussi simple que je peux penser. Notez que cette regex n'est pas exactement la même, puisque dans l'original les deux-points d'horodatage étaient tous optionnels, ce qui signifie que cela correspondrait à 01: 0203 ou 0102: 03 :, etc. Je pense que ma version pourrait être plus correcte. Fondamentalement, j'ai enlevé tous les groupes et les quantificateurs non-capturants que je pouvais, qui quand ils ne font que doubler un chiffre le rendent moins lisible, par opposition à plus. J'ai également supprimé le modificateur de gourmandise sur les quantificateurs, car ils vont toujours correspondre exactement à 2 ou 4 ou peu importe si c'est gourmand ou non.

Et bien sûr, cela correspondra aux dates invalides, telles que 13-32-0000. Pour résoudre ce problème, vous devrez décider si une solution complexe mais correcte est plus souhaitable qu'une solution simple, plus compréhensible. Fondamentalement, cela dépend de votre confiance dans le texte que vous utiliserez. S'il y a probablement des faux positifs que vous voulez filtrer, optez pour une solution plus correcte, même si elle est légèrement moins lisible.

+0

Ok merci, je vois ce que vous avez fait là. Je vais essayer de modifier ce modèle pour accepter des valeurs de date valides comme annakata souligné sous les commentaires OP. – Anders

+0

Est-ce que l'original et le vôtre ne seront pas tous identiques sur ---> (3 tirets), plutôt que -> (2 tirets) comme la plupart des exemples originaux contenus? – Twisol

+0

@Twistol - oups, j'ai oublié le troisième tiret. C'était un type; ( – Anders

0

Voici mon opinion ...

(?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)? 

peut sembler ne pas faire une plus courte.

+0

Assurez-vous de noter que celui-ci correspondra à plus de données invalides que l'original, par exemple la portion de temps pourrait être 01: 02: 03M , puisque les espaces et les caractères a/p sont mutuellement exclusivement optionnels au m. – Sean

Questions connexes