Problem mit Groovy- und Regex-Matching-Gruppen

Dec 03 2020

Ich komme hierher, nachdem ich einige andere Fragen und Beispiele gelesen habe wie:

Groovige Syntax für den Abgleich regulärer Ausdrücke

Groovy Regex / Pattern Matching

Auch diese Dokumentation habe ich online gefunden: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

Ich habe damit gespielt und ich habe eine meiner Meinung nach sehr einfache Regex, aber aus irgendeinem Grund bekomme ich immer keine Übereinstimmung.

Stellen Sie sich also vor, ich hätte eine Git-URL wie diese: "ssh: //[email protected]/project/repo.git"

Ich möchte das Projekt in meiner groovigen Pipeline extrahieren und sich selbst repo: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git "(vielleicht gibt es intelligentere Möglichkeiten, dieses Match zu machen, aber es sollte trotzdem funktionieren)

Das Problem ist jedenfalls, dass ich dies teste und im Moment nicht einmal das einfache SSH-Match machen kann, allein meine Gruppen. Es funktioniert gut in einem Online-Regex-Tester

Aber auf dem groovigen Spielplatz online funktioniert es nicht.

Dies ist das Beispiel (ich teste es hier https://groovy-playground.appspot.com/):

Diese Eingabe:

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 

Gibt keine Übereinstimmung aus:

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

Ich habe ein paar Dinge ausprobiert, aber nicht einmal SSH-Match funktioniert

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=]

Ich dachte, es könnte ein Problem im Tool sein, aber in meiner Jenkins-Pipeline funktioniert es auch nicht.

Auch das Beispiel aus der anderen Frage:

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

Antworten

2 WiktorStribiżew Dec 03 2020 at 11:12

Sie können Groovy die richtige Matcher-Methode selbst ausführen lassen, verwenden Sie einfach

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' 
}

Sehen Sie sich die Groovy-Demo an.

Mit =~operator weisen Sie Groovy tatsächlich an, Teilübereinstimmungen in längeren Zeichenfolgen zu finden. Mit ==~benötigen Sie eine vollständige Zeichenfolgenübereinstimmung. Sie müssen if (match)lediglich den Abgleich auslösen. Das matchenthält alle Übereinstimmungen, sodass Sie die erste über den nullten Index erhalten und dann über [1]und auf Gruppe 2 über Zugriff auf Gruppe 1 haben [2].

Regex-Tipp: Setzen Sie immer -am Ende der Zeichenklasse, wenn Sie mit einem wörtlichen Zeichen übereinstimmen -möchten.

MiguelCosta Dec 03 2020 at 11:04

das war eigentlich ein bisschen nicht das, was ich erwartet hatte, aber ich habe vergessen, die Methode match () aufzurufen

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