2
votes

Extraire uniquement / ou après un mot spécifique

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:

  • UserA Pending Merge hotfix / taskA to do
  • Fonctionnalité UserB Pending Merge / taskC_expansion done
  • UserC en attente de fusion à faire
  • Hotfix UserD Pending Merge à faire

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 à"


2 commentaires

Essayez / pending merge \ s * (. *?) \ S * (?: to do | done) / i , voir démo


cela résout le problème merci beaucoup


3 Réponses :


0
votes

Ce simple RegEx peut vous aider à le faire:

User[A-Z]{1} Pending Merge\s(.+|)(to\sdo|done)


0 commentaires

2
votes

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.

Démo Regex

Pending Merge\s+(\S+\/\S+|hotfix\b)


3 commentaires

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.



1
votes

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 .

 entrez la description de l'image ici

Démo JS:

/pending merge\s*(.*?)\s*(?:to do|done)/i


0 commentaires