2017-07-09 2 views
0

Pivotal Tracker peut analyser les validations git et modifier le statut du ticket en conséquence. J'écris un script PHP qui exécute post-commit. Il recherche le message de validation et s'il trouve la bonne référence de Pivotal Ticket, il l'enregistre dans l'API PT. Je vais un peu fou essayer de comprendre l'expression rationnelle.Correspondance Regex pour Pivotal Tracker

Actuellement, j'ai:

preg_match('/^\[#([0-9]{1,16})\]/', $commit['message'], $matches); 

Ainsi, l'exemple le plus simple d'un laissez-passer commit:

[#12345678] Made a commit 

Mais ce que je dois passer sont les suivantes:

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

Retirez l'ancre '^' car votre référence ne commence pas au début de la chaîne. Peut-être voulez-vous '\ [(? :(?: finished | fixed | complete))?) # ([0-9] {1,16}) \]' – chris85

+0

Y a-t-il des occurrences où une chaîne se trouve avant le # 'à l'intérieur de l'expression entre crochets et ce n'est pas' finished', 'complete', ou' fixed'?Voulez-vous capturer uniquement la sous-chaîne du nombre préfixé du hashtag, ou voulez-vous le mot principal lorsqu'il existe? Veuillez inclure toutes les chaînes "gotcha" qui doivent être évitées. Veuillez clarifier votre résultat attendu afin que nous puissions offrir une solution vraiment raffinée. Le mieux votre question, la qualité supérieure de notre réponse peut être. – mickmackusa

+0

Existe-t-il des expressions entre crochets qui ne doivent pas correspondre? – mickmackusa

Répondre

0

Les entrées échantillons sont:

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

Sur la base de notre modèle de regex, seule la partie numérique est ciblée.

Pour écrire le modèle le meilleur/le plus efficace pour correspondre exactement à vos chaînes d'entrée, n'utilisez pas de groupes de capture - utilisez \K.

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

Demo Link


Si vous devez vous assurer que l'avant l'#numbers vient soit: [rien], finished, fixed ou complete alors c'est aussi raffiné que je peux le faire:

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

Demo Link

... c'est le même effet que le modèle précédent, seul condensé légèrement:

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

Demo Link


Si ces modèles ne répondent pas à vos besoins réels pour une raison quelconque, s'il vous plaît laisser un commentez et éditez votre question. Je vais ajuster ma réponse pour créer une réponse précise et efficace pour vous.

+0

C'est génial. Votre premier exemple semble fonctionner, et me permet de passer n'importe quel commit qui correspond au modèle de base et laisse l'API Pivotal comprendre ce qu'il faut en faire. Merci!! – 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>'; 

Doit vous donner

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 
    ) 

) 

Comme vous pouvez le voir() dans l'acte d'expression regex en tant que groupes qui stocke les résultats dans un tableau $ m

$m[0] -> stores complete match 
$m[1] -> stores first group() 
$m[2] -> stores second group() 

Je pense que le plus sûr moyen de le faire est à un processus de validation à une fois, mais cet exemple vous montre simplement les cas d'utilisation dans la question.