J'ai donc besoin d'obtenir des heures, des minutes et des secondes des entrées comme celles-ci:
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. p>
et j'ai monté cette refente, cela fonctionne ..: p> mais c'est moche, et je veux le refroidir pour ne pas être 3 expressions différentes (principalement pour apprendre). J'ai essayé ceci: p> 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. P> p>
4 Réponses :
Je suggère l'expression suivante. P>
Ceci permettra aux heures unique des heures de chiffres combinées à des minutes à chiffres comme L'assertion positive de la lunette ^ ((((? 3: 7: 21 code>. Si cela n'est pas souhaité, une légère modification est requise. P>
^ (((? (? = [0-9] {2}) code> dans la deuxième expression résout ce problème. P>
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. P>
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! P>
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. P>
Points valides. La raison pour laquelle je veux le faire mieux est principalement d'apprendre.
Je n'ai pas encore testé cela, mais cela devrait fonctionner:
^(?:(?:(?<hours>\d\d?)[:\.])?(?<minutes>\d\d?)[:\.])?(?<seconds>\d\d?)$
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. :)
Ma suggestion: structuré: p> Si vous le souhaitez, vous pouvez envelopper la regex dans les délimiteurs - comme des limites de mots éditer: y penser, vous pouvez restreindre cela plus loin à Temps de capture qui n'aiment que. Utilisez p> à la place de p> pour capturer des valeurs comprises entre 0 et 59, le cas échéant (secondes et minutes) . p> p>
code> \ b code> ou ancrages de chaîne ( ^ code> et $ code>). p>
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 # code> au lieu de // code>?
En effet, cette réponse est géniale. A immédiatement perçu l'utilisation pratique des groupes dans des expressions régulières! :]
Ce n'est pas une langue-agnostique. La syntaxe d'expressions régulières est différente pour différentes langues.