2017-10-09 7 views
0

J'ai du texte avec des jours, heures, minutes, au format suivant:Exclure le symbole de la capture et obtenir uniquement les données requises?

4 d. 12 h. 32 m. 
7 h. 22 m. 
3 d. 14 h. 

Avis, que certains d'entre eux peuvent être apsent (par exemple: 3 d. 14 h. ne marche pas contient minutes)

Je veux saisir chiffres groupes nommés, mais ne capture pas les caractères (dhm). Donc finalement je dois obtenir le résultat quelque chose comme cette carte:

[ 
    'days' => 4, 
    'hours' => 12, 
    'minutes' => 32, 
] 

Ce que j'ai écrit: (?P<days>(\d+) d.)?(?P<hours>(\d+) h.)?(?P<minutes>(\d+) m.)?

Lien: https://regex101.com/r/FERRnd/1

Mais il semble qu'il y ait des éléments vides, et j'ai le sentiment que ce n'est pas la meilleure expression régulière pour cette tâche. Est-il possible de recevoir seulement les params nommés comme chiffres et rien d'autre (pas de champs vides, pas de texte comme 12 h. etc.)?

Merci beaucoup!

+0

@akond oui, c'est exactement ce dont j'ai besoin! Je vous remercie. –

Répondre

1

Essayez:

(?:(?P<days>\d+) d.)?\s*(?:(?P<hours>\d+) h.)?\s*(?:(?P<minutes>\d+) m.)? 
+1

Tout moyen de le faire sans faire correspondre la chaîne vide? – sln

+0

Il est plus facile de vérifier une chaîne vide dans un état séparé. – akond

0

solution de akond fonctionne si vous êtes ok avec correspondance chaîne vide. L'ajout d'une anticipation positive au début empêchera la chaîne vide correspondante:

(?=\d+\s[dhm]\.)(?:(?P<days>\d+) d.)?\s*(?:(?P<hours>\d+) h.)?\s*(?:(?P<minutes>\d+) m.)?