我是在阅读了一些其他问题和示例之后来到这里的:
Groovy syntax for regular expression matching
还有我在网上找到的这个文档: https://e.printstacktrace.blog/groovy-regular-expressions-the-definitive-guide/
我在玩它,我认为这是一个非常基本的正则表达式,但由于某种原因,我总是找不到匹配项。
所以想象我有一个像这样的 git url: “ssh://git@bitbucket.sits.net/project/repo.git”
我想在我的 groovy 管道中提取项目和 repo 本身: “ssh://git@bitbucket.sits.net/([a-zA-Z-]*)/([a-zA-Z-]*).git”(也许有进行这场比赛的更聪明的方法,但仍然应该有效)
无论如何,问题是我正在测试这个,目前我什至无法进行简单的 ssh 匹配,最后是我的组。 它在在线正则表达式测试器中运行良好
但它在 groovy playground online 中不起作用。
这是示例(我在这里测试 https://groovy-playground.appspot.com/ ):
这个输入:
GIT_URL='ssh://git@bitbucket.sits.net/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://git@bitbucket.sits.net/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://git@bitbucket.sits.net/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
将包含所有匹配项,因此您可以通过第 0 个索引获得第一个匹配项,然后您可以通过 [1]
访问第 1 组并使用[2]
。
正则表达式提示:如果要匹配文字 -
字符,请始终将 -
放在字符类的末尾。
关于regex - groovy 和 regex 匹配组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65124469/