8
votes

Heures / minutes correspondantes / secondes dans des expressions régulières - une meilleure façon?

J'ai donc besoin d'obtenir des heures, des minutes et des secondes des entrées comme celles-ci:

  • 04:43:12
  • 9.43.12
  • 1:00
  • 01.04
  • 59
  • 09

    Les deux premières sont des heures, des minutes et des secondes. À côté d'est minutes et secondes. Deux derniers sont juste quelques secondes.

    et j'ai monté cette refente, cela fonctionne ..: xxx

    mais c'est moche, et je veux le refroidir pour ne pas être 3 expressions différentes (principalement pour apprendre). J'ai essayé ceci: xxx

    mais cela ne fonctionne pas - les minutes et les secondes sont parfois bousillées. Mon cerveau fait mal, et je ne peux pas comprendre ce que je fais mal.


1 commentaires

Ce n'est pas une langue-agnostique. La syntaxe d'expressions régulières est différente pour différentes langues.


4 Réponses :


2
votes

Je suggère l'expression suivante.

^ ((((? [0-9] {1,2}) [.:])? (? [0-9] {1,2}) [.: ])? (? [0-9] {2}) $

Ceci permettra aux heures unique des heures de chiffres combinées à des minutes à chiffres comme 3: 7: 21 . Si cela n'est pas souhaité, une légère modification est requise.

^ (((? [0-9] {1,2}) [.:] (? = [0-9] {2}))? (? [0 -9] {1,2}) [.:])? (? [0-9] {2}) $

L'assertion positive de la lunette (? = [0-9] {2}) dans la deuxième expression résout ce problème.


0 commentaires

1
votes

Il n'y a pas de véritable bon moyen pour cela, car cela dépend vraiment de votre situation particulière, que faire quand toutes les trois parties ne sont pas spécifiées. Par exemple, dans de nombreux cas, je préférerais peut-être interpréter 3h30 sous 3 heures et 30 minutes au lieu de 3 minutes et 30 secondes. Il ne peut pas faire mal d'être explicite à ce sujet et de rendre facile de dériver de la regex ce que ces types d'intrants signifient.

Par conséquent, je crois personnellement que la première regex n'est pas si laide du tout - cela pourrait être moins "magique", mais c'est beaucoup plus lisible et maintenu. Assurez-vous que vous et d'autres personnes peuvent toujours lire et modifier le code plus tard!

Si votre langue le prend en charge, j'utiliserais des regextes étendues (avec le support pour les espaces et les commentaires) et la diviser sur trois lignes (ou 6 ou 9 si vous mettez un commentaire sur une ligne distincte). Cela ne changera pas la regex, mais cela fera sentir moins laids à coup sûr.


1 commentaires

Points valides. La raison pour laquelle je veux le faire mieux est principalement d'apprendre.



5
votes

Je n'ai pas encore testé cela, mais cela devrait fonctionner:

^(?:(?:(?<hours>\d\d?)[:\.])?(?<minutes>\d\d?)[:\.])?(?<seconds>\d\d?)$


3 commentaires

Cela fonctionne mais capturera 3: 7: 21 Qu'est-ce qui pourrait ou non être exséré à 3:07:21. Et au fait, il n'est pas nécessaire d'échapper au point dans des groupes de caractères. (Ou suis-je tort? Y a-t-il une implémentation de regex nécessitant cela?)


La barre oblique inverse sur DOT dans une classe de caractères est inutile. Permettant 3: 7: 21 pour 3:07:21 est probablement un exemple de «être généreux dans ce que vous acceptez».


J'ai tendance à échapper à certains personnages qui n'ont pas strictement besoin de s'échapper. Même si la classe de regex n'a pas besoin de le comprendre, je pourrais. :)



11
votes

Ma suggestion: xxx

structuré: xxx

Si vous le souhaitez, vous pouvez envelopper la regex dans les délimiteurs - comme des limites de mots
code> \ b ou ancrages de chaîne ( ^ et $ ).

éditer: y penser, vous pouvez restreindre cela plus loin à Temps de capture qui n'aiment que. Utilisez xxx

à la place de xxx

pour capturer des valeurs comprises entre 0 et 59, le cas échéant (secondes et minutes) .


3 commentaires

Impressionnant! Fonctionne bien - et aime aussi le formatage. Si seulement mon éditeur soutiendrait cela, il serait plus facile de travailler avec.


N'est-ce pas le caractère de commentaire des expressions régulières dans "Ignorer WhitSpace et Autoriser les commentaires" Mode # au lieu de // ?


En effet, cette réponse est géniale. A immédiatement perçu l'utilisation pratique des groupes dans des expressions régulières! :]