2017-07-09 31 views
0

Pivotal Tracker可以解析git提交併相應地更改票證狀態。我正在編寫一個執行post-commit的PHP腳本。它搜索提交消息,如果它找到了正確的Pivotal Ticket引用,它會將其發佈到PT api。我試圖弄清楚正則表達式。Pivotal Tracker的正則表達式匹配

目前我有:

preg_match('/^\[#([0-9]{1,16})\]/', $commit['message'], $matches); 

所以提交通行證的最簡單的例子:但我需要通過什麼

[#12345678] Made a commit 

如下:

1: [finished #12345678] Made a commit //'fixed', 'complete', or 'finished' changes the status 
2: I made a commit [#12345678] to a story //Can occur anywhere in the commit 
+0

取下錨點'^',因爲您的引用不會從字符串的開始處開始。也許你想要'\ [(?:(完成|修正|完成))?)#([0-9] {1,16})\]' – chris85

+0

是否有任何出現字符串在# '在括號內的表達式中,它不是「完成」,「完成」或「固定」?你想僅捕獲標籤前綴的數字子字符串,還是希望當前存在的字詞?請包含任何需要避免的「疑難」字符串。請澄清您的預期結果,以便我們能夠提供真正完善的解決方案。你的問題越好,我們的迴應就越高。 – mickmackusa

+0

是否有任何括號內的表達式不應該匹配? – mickmackusa

回答

0

將樣品輸入是:

I made a commit [#12345678] to a story 
[finished #12345678] Made a commit 
[fixed #12345678] Made a commit 
[complete #12345678] Made a commit 

基於我們的正則表達式模式中,只有數字部的目標。

要編寫最佳/最有效的模式以準確地匹配您的輸入字符串,請勿使用捕獲組 - 請使用\K

/\[[^#]*#\K\d{1,16}/ #just 24 steps 

Demo Link


如果您需要確保在#numbers之前談到之一:[無],finishedfixed,或者complete那麼這是因爲精緻的,因爲我可以把它:

/\[(?:fixed ?|finished ?|complete ?)?#\K\d{1,16}/ #59 steps 

Demo Link

...這是因爲以前的模式相同的效果,只是稍微濃縮:

/\[(?:fi(?:x|nish)ed ?|complete ?)?#\K\d{1,16}/ #59 steps 

Demo Link


如果這些模式並不滿足任何原因,你的實際要求,請留下評論和編輯你的問題。我會調整我的答案,爲您創建一個最有效的準確答案。

+0

這太好了。您的第一個示例似乎可行,並允許我傳遞與基本模式匹配的任何提交,並讓Pivotal API找出如何處理它。謝謝!! – Scott

0
$string = '2: I made a commit [#12345678] to a story 
1: [finished #12345678] Made a commit 
3: [fixed #12345678] Made a commit 
4: [complete #12345678] Made a commit'; 

$m = []; 
$regex = '/.*\[(finished|fixed|complete)?\s*#(\d+)\]/'; 

preg_match_all($regex,$string,$m); 

echo '<pre>'; 
print_r($m); 
echo '</pre>'; 

應該給你

Array 
(
[0] => Array 
    (
     [0] => 2: I made a commit [#12345678] 
     [1] => 1: [finished #12345678] 
     [2] => 3: [fixed #12345678] 
     [3] => 4: [complete #12345678] 
    ) 

[1] => Array 
    (
     [0] => 
     [1] => finished 
     [2] => fixed 
     [3] => complete 
    ) 

[2] => Array 
    (
     [0] => 12345678 
     [1] => 12345678 
     [2] => 12345678 
     [3] => 12345678 
    ) 

) 

正如你所看到的()在正則表達式充當組存儲陣列中的$ M結果

$m[0] -> stores complete match 
$m[1] -> stores first group() 
$m[2] -> stores second group() 

我認爲這樣做最安全的方式是處理一個犯在一段時間,但這個例子只是向你展示了這個問題中的用例。