Проблема с группами соответствия groovy и regex
Я попал сюда после прочтения некоторых других вопросов и примеров, например:
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=]
Ответы
Вы можете оставить 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]
.
Совет по регулярным выражениям: всегда помещайте -
в конец класса символов, если вы хотите сопоставить буквальный -
символ.
на самом деле это было немного не то, что я ожидал, но я забыл вызвать метод 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