Masalah dengan grup pencocokan groovy dan regex

Dec 03 2020

Saya sampai di sini setelah membaca beberapa pertanyaan dan contoh lain seperti:

Sintaks yang groovy untuk pencocokan ekspresi reguler

Pencocokan regex / pola yang asyik

Juga dokumentasi ini yang saya temukan online: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

Saya bermain dengannya dan saya memiliki apa yang menurut saya adalah regex yang sangat mendasar, tetapi entah mengapa saya selalu tidak mendapatkan kecocokan.

Jadi membayangkan saya memiliki url git seperti ini: "ssh: //[email protected]/project/repo.git"

Saya ingin mengekstrak proyek dan repo itu sendiri dalam pipeline groovy saya: "ssh: //[email protected]/ ([a-zA-Z- ] *) / ([a-zA-Z- ] *) .git "(mungkin ada cara yang lebih cerdas untuk melakukan pencocokan ini, tetapi masih dapat berfungsi)

Bagaimanapun masalahnya adalah bahwa saya sedang menguji ini dan saat ini saya bahkan tidak dapat membuat pertandingan ssh sederhana, terakhir sendirian grup saya. Ini berfungsi dengan baik di penguji regex online

Tapi itu tidak berhasil di taman bermain online yang asyik.

Ini contohnya (saya sedang mengujinya di sini https://groovy-playground.appspot.com/):

Masukan ini:

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 

Tidak menghasilkan kecocokan:

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

Saya sudah mencoba beberapa hal tetapi bahkan ssh tidak berhasil

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

Saya pikir ini bisa menjadi masalah pada alat tetapi di pipeline Jenkins saya, itu juga tidak berfungsi.

Juga contoh dari pertanyaan lain:

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

Jawaban

2 WiktorStribiżew Dec 03 2020 at 11:12

Anda dapat membiarkan Groovy mengeksekusi metode matcher yang tepat itu sendiri, cukup gunakan

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

Lihat demo Groovy.

Dengan =~operator, Anda benar-benar memberi tahu Groovy untuk menemukan kecocokan parsial di dalam string yang lebih panjang, dengan ==~, Anda memerlukan kecocokan string penuh. Yang Anda butuhkan hanyalah if (match)memicu pencocokan. The matchakan berisi semua pertandingan, sehingga Anda mendapatkan yang pertama melalui indeks ke nol, dan kemudian Anda memiliki akses ke Grup 1 melalui [1]dan untuk Grup 2 menggunakan [2].

Tip Regex: selalu letakkan -di akhir kelas karakter jika Anda bermaksud mencocokkan -karakter literal .

MiguelCosta Dec 03 2020 at 11:04

ini sebenarnya sedikit tidak seperti yang saya harapkan tetapi saya lupa memanggil metode pertandingan ()

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