Problema com grupos de correspondência groovy e regex

Dec 03 2020

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

2 WiktorStribiżew Dec 03 2020 at 11:12

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 matchconterá 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 .

MiguelCosta Dec 03 2020 at 11:04

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