2017-07-09 5 views
0

ピボット・トラッカーは、gitコミットを解析し、それに従ってチケット状況を変更することができます。私はポストコミットを実行するPHPスクリプトを書いています。それはコミットメッセージを検索し、正しいピボットチケット参照を見つけたら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 
+0

参照が文字列の先頭から始まらないため、アンカー '^'を外してください。 #([0-9] {1,16})\] ' – chris85

+0

文字列が'#〜 'の前にある場合、 '括弧で囲まれた式の中にあり、' finished'、 'complete'、' fixed'ではありませんか?先頭にハッシュタグが付いている部分文字列だけを取り込みたいのですか、または存在する場合は先頭の単語を使用しますか?回避する必要のある「犯された」文字列を含めてください。真に洗練されたソリューションを提供できるよう、期待した結果を明確にしてください。あなたの質問が良ければ、私たちの反応はより高品質になります。 – 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

これは素晴らしいことです。あなたの最初の例はうまくいくように見え、基本パターンに合ったコミットを私に渡して、Pivo​​tal 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[0] -> stores complete match 
$m[1] -> stores first group() 
$m[2] -> stores second group() 

で結果を保存するグループなどの正規表現表現行為に()を見ることができるように私はこれを行うための最も安全な方法は、1がでコミット処理することだと思いますこの例では、質問のユースケースを示しています。