Pivotal Tracker 的正则表达式匹配

Regex match for Pivotal Tracker

Pivotal Tracker 可以解析 git 提交并相应地更改票证状态。我正在编写一个执行 post-commit 的 PHP 脚本。它搜索提交消息,如果找到正确的 Pivotal Ticket 引用,它 post 将其发送到 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
$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 () 

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

示例输入为:

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

根据我们的正则表达式模式,只有数字部分是目标。

要编写 best/most 高效模式以准确匹配您的输入字符串,请不要使用捕获组——使用 \K.

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

Demo Link


如果您需要确保 #numbers 出现之前是:[nothing]、finishedfixedcomplete 那么这就像我能做到:

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

Demo Link

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

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

Demo Link


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