Problème avec les groupes de correspondance groovy et regex

Dec 03 2020

J'arrive ici après avoir lu d'autres questions et exemples comme:

Syntaxe Groovy pour la correspondance d'expressions régulières

Correspondance groovy regex / motif

Aussi cette documentation que j'ai trouvée en ligne: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

Je jouais avec et j'ai ce que je pense être une regex très basique, mais pour une raison quelconque, je n'ai toujours pas de match.

Donc imaginer que j'ai une url git quelque chose comme ceci: "ssh: //[email protected]/project/repo.git"

Je veux extraire dans mon pipeline groovy le projet et le repo lui-même: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git "(il existe peut-être des moyens plus intelligents de faire cette correspondance, mais cela devrait quand même fonctionner)

Quoi qu'il en soit, le problème est que je teste cela et pour le moment je ne peux même pas faire le simple match ssh, durer seul mes groupes. Cela fonctionne bien dans un testeur de regex en ligne

Mais cela ne fonctionne pas dans le terrain de jeu groovy en ligne.

Ceci est l'exemple (je le teste ici https://groovy-playground.appspot.com/):

Cette entrée:

GIT_URL='ssh://[email protected]/project/repo.git'

def match = GIT_URL =~ /ssh:\/\/git@bitbucket\.sits\.net\/([a-zA-Z-_]*)\/([a-zA-Z-_]*)\.git/

println match 

Sorties sans correspondance:

java.util.regex.Matcher[pattern=ssh://git@bitbucket\.sits\.net/([a-zA-Z-_]*)/([a-zA-Z-_]*)\.git region=0,45 lastmatch=]

J'ai essayé quelques trucs mais même pas le match ssh fonctionne

GIT_URL='ssh://[email protected]/project/repo.git'

def match = GIT_URL =~ /ssh/

println match 
java.util.regex.Matcher[pattern=ssh region=0,45 lastmatch=]

Je pensais que cela pouvait être un problème dans l'outil, mais dans mon pipeline Jenkins, cela ne fonctionne pas non plus.

Aussi l'exemple de l'autre question:

def match2 = "f1234" =~ /[a-z]\d{4}/
println match2
java.util.regex.Matcher[pattern=[a-z]\d{4} region=0,5 lastmatch=]

Réponses

2 WiktorStribiżew Dec 03 2020 at 11:12

Vous pouvez laisser Groovy exécuter la bonne méthode de mise en correspondance elle-même, utilisez simplement

String GIT_URL='ssh://[email protected]/project/repo.git'
def match = GIT_URL =~ /ssh:\/\/git@bitbucket\.sits\.net\/([a-zA-Z_-]*)\/([a-zA-Z_-]*)\.git/
if (match) { 
    println match[0][1]
    println match[0][2]
} else {
    println 'No match' 
}

Voir la démo Groovy.

Avec =~operator, vous dites en fait à Groovy de trouver des correspondances partielles dans des chaînes plus longues, avec ==~, vous avez besoin d'une correspondance de chaîne complète. Tout ce dont vous avez besoin est if (match)de déclencher la correspondance. Le matchcontiendra toutes les correspondances, vous obtenez donc la première via l'index zéro, puis vous avez accès au groupe 1 via [1]et au groupe 2 en utilisant [2].

Astuce Regex: toujours mettre -à la fin de la classe de caractères si vous voulez faire correspondre un caractère littéral -.

MiguelCosta Dec 03 2020 at 11:04

ce n'était pas vraiment ce à quoi je m'attendais mais j'ai oublié d'appeler la méthode matches ()

GIT_URL='ssh://[email protected]/project/repo.git'

def match = GIT_URL =~ /ssh:\/\/git@bitbucket\.sits\.net\/([a-zA-Z-_]*)\/([a-zA-Z-_]*)\.git/
match.matches()
println match.group(1)
println match.group(2)
project
repo