0

Pivotal Tracker 可以解析 git 提交并相应地更改票证状态。我正在编写一个执行 post-commit 的 PHP 脚本。它搜索提交消息,如果找到正确的 Pivotal Ticket 引用,则将其发布到 PT api。我想弄清楚正则表达式有点疯狂。

目前我有:

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
4

2 回答 2

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

演示链接


如果您需要确保在出现之前#numbers: [nothing], finished, fixed, 或者complete这是我可以做到的那样精致:

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

演示链接

...这与之前的模式效果相同,只是稍微浓缩:

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

演示链接


如果这些模式由于任何原因不能满足您的实际要求,请发表评论并编辑您的问题。我将调整我的答案,为您创建一个最有效的准确答案。

于 2017-07-09T11:05:43.033 回答
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 () 

我认为最安全的方法是一次处理一个提交,但这个示例只是向您展示问题中的用例。

于 2017-07-09T06:05:36.950 回答