【问题标题】:Problem with groovy and regex matching groupsgroovy 和正则表达式匹配组的问题
【发布时间】:2020-12-03 10:47:43
【问题描述】:

在阅读了其他一些问题和示例后,我来到了这里:

Groovy syntax for regular expression matching

Groovy regex/pattern 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 在线游乐场中不起作用。

这是示例(我在这里测试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=]

【问题讨论】:

    标签: regex groovy


    【解决方案1】:

    您可以让 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 将包含所有匹配项,因此您可以通过第零个索引获得第一个匹配项,然后您可以通过 [1] 访问第 1 组,使用[2] 访问第 2 组。

    正则表达式提示:如果您要匹配文字 - 字符,请始终将 - 放在字符类的末尾。

    【讨论】:

    • 谢谢,就是这样,我试图了解触发匹配的原因,不知道关于 if 的那部分
    【解决方案2】:

    这实际上有点出乎我的意料,但我忘了调用方法 matches()

    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/
    match.matches()
    println match.group(1)
    println match.group(2)
    project
    repo
    

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多