Problem z grupami dopasowującymi groovy i regex

Dec 03 2020

Jestem tutaj po przeczytaniu kilku innych pytań i przykładów, takich jak:

Groovy składnia do dopasowywania wyrażeń regularnych

Groovy dopasowanie wyrażeń regularnych / wzorców

Również tę dokumentację znalazłem online: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

Bawiłem się tym i mam to, co uważam za bardzo podstawowe wyrażenie regularne, ale z jakiegoś powodu zawsze nie mam dopasowania.

Więc wyobrażam sobie, że mam adres URL git podobny do tego: „ssh: //[email protected]/project/repo.git”

Chcę wyodrębnić projekt z mojego groovy pipeline i samemu repo: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git ”(być może istnieją sprytniejsze sposoby na wykonanie tego dopasowania, ale nadal powinny działać)

W każdym razie problem polega na tym, że testuję to i w tej chwili nie mogę nawet dopasować prostego dopasowania ssh, a na końcu moich grup. Działa dobrze w testerze regex online

Ale to nie działa na fajnym placu zabaw online.

To jest przykład (tutaj go testuję https://groovy-playground.appspot.com/):

To wejście:

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 

Brak zgodności wyników:

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

Próbowałem kilku rzeczy, ale nawet dopasowanie ssh nie działa

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

Myślałem, że może to być problem w narzędziu, ale w moim potoku Jenkins również nie działa.

Również przykład z drugiego pytania:

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

Odpowiedzi

2 WiktorStribiżew Dec 03 2020 at 11:12

Możesz zostawić Groovy'ego, aby sam wykonywał właściwą metodę dopasowania, po prostu użyj

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

Zobacz demo Groovy.

Używając =~operatora, w rzeczywistości mówisz Groovy'emu, aby znalazł częściowe dopasowania wewnątrz dłuższych ciągów, a ==~potrzebujesz pełnego dopasowania ciągu. Wystarczy if (match)uruchomić dopasowywanie. matchBędzie zawierać wszystkie mecze, więc masz pierwszy z nich za pomocą wskaźnika zerowego, a następnie masz dostęp do grupy 1 poprzez [1]i do grupy 2 użyciem [2].

Wskazówka dotycząca wyrażeń regularnych: zawsze umieszczaj -na końcu klasy znaków, jeśli chcesz dopasować dosłowny -znak.

MiguelCosta Dec 03 2020 at 11:04

to było właściwie trochę nie to, czego się spodziewałem, ale zapomniałem wywołać metodę dopasowań ()

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