Groovyと正規表現のマッチンググループに関する問題

Dec 03 2020

次のような他の質問や例を読んだ後、ここに来ました。

正規表現マッチングのためのGroovy構文

Groovyの正規表現/パターンマッチング

また、私がオンラインで見つけたこのドキュメント: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/

私はそれで遊んでいて、非常に基本的な正規表現だと思うものを持っていますが、何らかの理由で私はいつも一致しません。

だから私が次のようなgitURLを持っていると想像してください: "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マッチも機能しません

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を取得して、すべての一致を含んで、その後、あなたは経由して、グループ1にアクセスする必要があります[1]使用してグループ2とします[2]

正規表現のヒント:-リテラル-文字と一致させる場合は、常に文字クラスの最後に配置してください。

MiguelCosta Dec 03 2020 at 11:04

これは実際には私が期待していたものではありませんでしたが、matches()メソッドを呼び出すのを忘れていました

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