首页 > 解决方案 > 使用正则表达式捕获詹金斯管道中的数据

问题描述

我想在我的 Jenkins 管道中拆分一个 docker 图像 uri。示例 uri = https://test-registry.home.imagehub.com/engineering/images/rhel:latest。我想把它分成4个部分。

https://(test-registry).home.imagehub.com/(engineering/images)/(rhel):(最新)

$1 = 测试注册

$2 = 工程/图像

3 美元 = 瑞尔

4 美元 = 最新

警告 $2 有时只有一个目录级别

我相信正确的正则表达式是:

/\w+:\/\/(.*)\.[^\/]+/(.*)/(\w+):(.*)/

这应该以 1 美元的价格//s获取第一个(期间)之后的所有内容.

应该通过[^\/]子域向上移动到 / 分隔符

我希望第二个(.*)贪婪到但不包括最后一个 / 分隔符。

第三部分应该抓住最后一个/分隔线之后和之前的所有内容:

第 4 部分应该抓住:(冒号)之后的所有内容

我确实包含了正则表达式

import java.util.regex.Pattern

I have tried a lot of different solutions to make this work in my jenkins declarative pipeline such as inline:
sReg = https://test-registry.home.imagehub.com/engineering/images/rhel:latest

pipeline

  agent

  stages

  stage ('regex')

    steps

    scripts

      def sReg = https://test-registry.home.imagehub.com/engineering/images/rhel:latest

     def registry = sReg =~ /\w+:\/\/(.*)\./

在这里我期望:

registry = test-registry 

所以我回应了结果

echo registry.group(1)

但这给了我:

java.lang.IllegalStateException:找不到匹配项

这没有任何意义。我尝试过获取 https/(\w+):/但结果相同。

我也尝试过上课,但结果相同,没有匹配项。

我想一次性完成所有四个,但如果需要,我会在单独的正则表达式中提取每个部分。在这一点上,我想弄清楚我至少可以得到一场比赛。

我补充说:

导入 java.util.regex.Matcher

然后在我添加的脚本部分中:

def registry = Sreg =~ ///([^.]+)[^/]+/((?:[^/]+/)*[^/]+)/(.+):(.+) /

println(注册表)

当我运行管道时,我得到:

[管道] 回声

java.util.regex.Matcher[pattern=//([^.]+)[^/]+/((?:[^/]+/)*[^/]+)/(.+):( .+) 区域=0,78 最后一场比赛=]

所以不是提取信息而是等于模式?

我在 Sreg 上做了一个回声,它显示了 uri,所以它应该在我的 def 中获取 uri。

标签: regexjenkinsgroovy

解决方案


您可以通过以下方式访问组:

def sReg = "https://test-registry.home.imagehub.com/engineering/images/rhel:latest"
def registry = sReg =~ /\w+:\/\/(.*)\.[^\/]+/(.*)/(\w+):(.*)/

println registry[0] //For all groups
println registry[0][1] //For group 1

来源和例子:https ://mrhaki.blogspot.com/2009/09/groovy-goodness-matchers-for-regular.html


推荐阅读