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