Problema con los grupos de coincidencia groovy y regex

Dec 03 2020

Llego aquí después de leer algunas otras preguntas y ejemplos como:

Sintaxis maravillosa para la coincidencia de expresiones regulares

Regex maravilloso / coincidencia de patrones

También esta documentación que encontré en línea: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

Estaba jugando con él y tengo lo que creo que es una expresión regular muy básica, pero por alguna razón no siempre obtengo coincidencia.

Entonces, imaginando que tengo una URL de git algo como esto: "ssh: //[email protected]/project/repo.git"

Quiero extraer en mi canalización maravillosa el proyecto y el repositorio en sí: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git "(tal vez haya formas más inteligentes de hacer esta coincidencia, pero aún debería funcionar)

De todos modos, el problema es que estoy probando esto y en este momento ni siquiera puedo hacer la simple coincidencia de ssh, el último solo de mis grupos. Funciona bien en un probador de expresiones regulares en línea

Pero no funciona en el maravilloso patio de recreo en línea.

Este es el ejemplo (lo estoy probando aquí 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 

Las salidas no coinciden:

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

He intentado algunas cosas, pero ni siquiera ssh match 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=]

Pensé que podría ser un problema en la herramienta, pero en mi canalización de Jenkins tampoco funciona.

También el ejemplo de la otra pregunta:

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

Respuestas

2 WiktorStribiżew Dec 03 2020 at 11:12

Puede dejar que Groovy ejecute el método de comparación correcto, solo use

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

Vea la demostración de Groovy.

Con el =~operador, en realidad le dices a Groovy que busque coincidencias parciales dentro de cadenas más largas, con ==~, necesitas una coincidencia de cadena completa. Todo lo que necesita es if (match)activar la coincidencia. El matchcontendrá todas las coincidencias, por lo que obtiene la primera a través del índice cero, y luego tiene acceso al Grupo 1 a través [1]y al Grupo 2 usando [2].

Consejo de expresiones regulares: colóquelo siempre -al final de la clase de caracteres si desea hacer coincidir un -carácter literal .

MiguelCosta Dec 03 2020 at 11:04

esto en realidad no era un poco lo que esperaba, pero olvidé llamar al método coincide ()

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