2017-10-09 80 views
0

我有天,小時,分鐘文本,在格式如下:從捕捉排除符號並獲得所需要的數據?

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

注意,其中一些可能會apsent(如:3 d. 14 h.犯規包含分鐘)

我想捕捉位在命名組,但不捕獲字符(dhm)。所以最後我需要得到的結果是這樣的地圖:

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

這是我寫的:(?P<days>(\d+) d.)?(?P<hours>(\d+) h.)?(?P<minutes>(\d+) m.)?

鏈接:https://regex101.com/r/FERRnd/1

但似乎有一些空元素,和我有感覺這不是這個任務的最佳正則表達式。有沒有什麼辦法只收到名爲PARAMS的數字,並沒有別的(沒有空場,沒有文字像12 h.等)?

非常感謝!

+0

@akond是的,這正是我需要的!謝謝。 –

回答

1

嘗試:如果你確定匹配空字符串

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

任何方式做到這一點不匹配空字符串? – sln

+0

這是比較容易檢查在一個單獨的條件爲空字符串。 – akond

0

akond的解決方案工作。在開頭處添加正向預覽會阻止匹配空字符串:

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