Problema com grupos de correspondência groovy e regex
Estou chegando aqui depois de ler algumas outras perguntas e exemplos como:
Sintaxe Groovy para correspondência de expressão regular
Correspondência de padrão / regex bacana
Também esta documentação que encontrei online: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/
Eu estava jogando com ele e tenho o que considero um regex muito básico, mas por alguma razão eu sempre não consigo nenhuma correspondência.
Imaginando que tenho um url git parecido com este: "ssh: //[email protected]/project/repo.git"
Quero extrair do meu canal bacana o projeto e o repo em si: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git "(talvez haja maneiras mais inteligentes de fazer essa correspondência, mas ainda deve funcionar)
De qualquer forma, o problema é que estou testando isso e no momento não consigo nem fazer o simples ssh match, por último sozinho meus grupos. Funciona bem em um testador de regex online

Mas não funciona no playground online bacana.
Este é o exemplo (estou testando aqui https://groovy-playground.appspot.com/):
Esta entrada:
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
Não resulta em correspondência:
java.util.regex.Matcher[pattern=ssh://git@bitbucket\.sits\.net/([a-zA-Z-_]*)/([a-zA-Z-_]*)\.git region=0,45 lastmatch=]
Eu tentei algumas coisas, mas nem mesmo a correspondência ssh funciona
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=]
Achei que poderia ser um problema na ferramenta, mas no meu pipeline do Jenkins também não funciona.
Também o exemplo da outra questão:
def match2 = "f1234" =~ /[a-z]\d{4}/
println match2
java.util.regex.Matcher[pattern=[a-z]\d{4} region=0,5 lastmatch=]
Respostas
Você pode deixar o Groovy executar o próprio método de correspondência certo, basta usar
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'
}
Veja a demonstração do Groovy.
Com o =~
operador, você realmente diz ao Groovy para encontrar correspondências parciais dentro de strings mais longas, com ==~
, você exige a correspondência de string completa. Tudo que você precisa é if (match)
acionar a correspondência. O match
conterá todas as correspondências, então você obtém a primeira por meio do índice zero, e então você tem acesso ao Grupo 1 via [1]
e ao Grupo 2 usando [2]
.
Dica Regex: sempre coloque -
no final da classe de caractere se você pretende corresponder a um -
caractere literal .
na verdade, isso não era o que eu esperava, mas esqueci de chamar o método match ()
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