Проблема с группами соответствия groovy и regex

Dec 03 2020

Я попал сюда после прочтения некоторых других вопросов и примеров, например:

Groovy синтаксис для сопоставления регулярных выражений

Groovy регулярное выражение / сопоставление с образцом

Также эту документацию я нашел в Интернете: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

Я играл с ним, и у меня есть то, что я считаю очень простым регулярным выражением, но по какой-то причине у меня всегда нет совпадений.

Итак, представьте, что у меня есть URL-адрес git примерно так: "ssh: //[email protected]/project/repo.git"

Я хочу извлечь проект в свой отличный конвейер и сделать репозиторий: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git "(возможно, есть более разумные способы сопоставления, но они все равно должны работать)

В любом случае проблема в том, что я тестирую это, и на данный момент я даже не могу сделать простое совпадение ssh, в последнюю очередь мои группы. Он отлично работает в онлайн-тестере регулярных выражений

Но на заводной игровой площадке он не работает.

Это пример (я тестирую его здесь https://groovy-playground.appspot.com/):

Этот ввод:

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 

Выходы не совпадают:

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

Я пробовал несколько вещей, но даже ssh match не работает

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

Я думал, что это может быть проблема в инструменте, но в моем конвейере Jenkins это тоже не работает.

Также пример из другого вопроса:

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

Ответы

2 WiktorStribiżew Dec 03 2020 at 11:12

Вы можете оставить Groovy сам выполнять правильный метод сопоставления, просто используйте

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

См. Демонстрацию Groovy.

С помощью =~оператора вы фактически указываете Groovy находить частичные совпадения внутри более длинных строк, с помощью которого ==~требуется полное совпадение строки. Все, что вам нужно, это if (match)активировать сопоставление. Он matchбудет содержать все совпадения, поэтому вы получите первое через нулевой индекс, а затем у вас будет доступ к Группе 1 через [1]и к Группе 2 с помощью [2].

Совет по регулярным выражениям: всегда помещайте -в конец класса символов, если вы хотите сопоставить буквальный -символ.

MiguelCosta Dec 03 2020 at 11:04

на самом деле это было немного не то, что я ожидал, но я забыл вызвать метод 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