Problema con los grupos de coincidencia groovy y regex
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
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 match
contendrá 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 .
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