J'essaye de construire une regex qui extraire une partie spécifique de la chaîne de manière agréable. Je peux recevoir des chaînes qui ressemblent à ceci:
La chaîne après la fusion en attente est essentiellement un nom de branche.
Je peux gérer les cas où, après la fusion en attente, il n'y a pas de nom de branche, mais si l'expression régulière pour tous existe, ce serait génial .
J'ai essayé:
[^ fusion en attente]. (\ w *) le premier mot est mis en correspondance avec "à".
fusion en attente (. \ w + \ W + \ w +) mais en cas de "correctif de fusion en attente à faire", il correspond à "correctif à"
3 Réponses :
Ce simple RegEx peut vous aider à le faire:
User[A-Z]{1} Pending Merge\s(.+|)(to\sdo|done)
Vous pouvez utiliser cette expression régulière,
var arr = ['UserA Pending Merge hotfix/taskA to do','UserB Pending Merge feature/taskC_expansion done','UserC Pending Merge to do','UserD Pending Merge hotfix to do']
for (s of arr) {
var m = /Pending Merge\s+(\S+\/\S+|hotfix\b)/i.exec(s)
if (m != null) {
console.log(s + " --> " +/Pending Merge\s+(\S+\/\S+|hotfix\b)/i.exec(s)[1])
} else {
console.log('No branch found')
}
}Et capturer votre branche du groupe1
Les chaînes qui n'ont pas de chaîne de ce format string1 / string2 ne correspondra pas et j'espère que c'est ce à quoi vous vous attendez.
Pending Merge\s+(\S+\/\S+|hotfix\b)
désolé peut-être que j'aurais dû l'expliquer clairement que même dans le cas où il n'y a que "hotfix", il devrait correspondre.
@Arin: Ok, très simple à manipuler. Juste quelques instants. Si la chaîne n'est pas au format string1 / string2 , vous souhaitez uniquement faire correspondre le hotfix ? ou quelque chose de plus autour? Pouvez-vous ajouter cet exemple et le comportement attendu dans votre message s'il vous plaît?
@Arin: mis à jour pour capturer le correctif. Faites-moi savoir si cela fonctionne bien et faites-moi savoir si vous avez une autre logique de capturer autre chose.
Vous pouvez utiliser
var strs = ['UserA Pending Merge hotfix/taskA to do',
'UserB Pending Merge feature/taskC_expansion done',
'UserC Pending Merge to do',
'UserD Pending Merge hotfix to do'];
var regex = /pending merge\s*(.*?)\s*(?:to do|done)/i;
for (var s of strs) {
console.log(s);
var m = s.match(regex);
if (m) {
console.log("FOUND: ", m[1]);
}
}Voir la démo regex a >.
Détails
fusion en attente - une sous-chaîne littérale \ s * - 0+ espaces blancs (. *?) - Groupe de capture 1: 0+ caractères autres que les caractères de saut de ligne, aussi peu que possible \ s * - 0+ espaces blancs (?: to do | done) - soit to do ou done . Démo JS:
/pending merge\s*(.*?)\s*(?:to do|done)/i
Essayez
/ pending merge \ s * (. *?) \ S * (?: to do | done) / i, voir démocela résout le problème merci beaucoup