2017-07-09 32 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() 

我认为这样做最安全的方式是处理一个犯在一段时间,但这个例子只是向你展示了这个问题中的用例。