Jenkins 在Groovy中使用分隔符拆分字符串并避免IndexOutOfBoundsException

Jenkins 在Groovy中使用分隔符拆分字符串并避免IndexOutOfBoundsException,jenkins,groovy,jenkins-pipeline,jenkins-groovy,groovy-console,Jenkins,Groovy,Jenkins Pipeline,Jenkins Groovy,Groovy Console,我想将输入参数inputDetails拆分为单元级。我正在使用tokenize来实现这一点。这是我的密码: Groovy代码: def inputDetails = "1234-a0-12;1111-b0-34"; def cDesc = inputDetails.tokenize(";"); for (int i=0; i<cDesc.size(); ++i) { def cVer = cDesc.get(i); def cNum = cVer.tokenize("-")

我想将输入参数
inputDetails
拆分为单元级。我正在使用tokenize来实现这一点。这是我的密码:

Groovy代码:

def inputDetails = "1234-a0-12;1111-b0-34";
def cDesc = inputDetails.tokenize(";");
for (int i=0; i<cDesc.size(); ++i)
{
    def cVer = cDesc.get(i);
    def cNum = cVer.tokenize("-");
    def a = cNum.get(0);
    def b = cNum.get(1);
    def c = cNum.get(2);

    println (" DEBUG : Input details are, ${a} : ${b} : ${c} \n");
}
此输出正确且符合预期。但如果我将Groovy代码的第一行更改为:

def inputDetails = "1234-a0-12;1111-b0";
我收到以下错误消息:

 java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java_util_List$get$6.call(Unknown Source)
    at Script1.run(Script1.groovy:9)

如何修复它以防止在同时支持这两种情况下获得
IndexOutOfBoundsException
1234-a0-12;1111-b0-34和1234-a0-12;1111-b0
输入?

您可以通过在“-”上进一步拆分,将字符串拆分为二维列表:

def inputDetails = "1234-a0-12;1111-b0-34"
def elements = inputDetails.split(';').collect{it.split('-')}
元素
属于
列表
类型。打印时,它会产生:

[[1234, a0, 12], [1111, b0, 34]]
这样,您就可以提供更大的灵活性,而不是硬编码数组索引

使用
“1234-a0-12;1111-b0”
,它被分为
[[1234,a0,12],[1111,b0]]

您可以使用Groovy的功能从第二个标记化中安全地获取3个值。考虑下面的例子:

def inputDetails = "1234-a0-12;1111-b0-34"

def cDesc = inputDetails.tokenize(";")

cDesc.each { part ->
    def (p1, p2, p3) = part.tokenize('-')

    println "DEBUG: Input details are, ${p1} : ${p2} : ${p3}"
}
输出:

 DEBUG : Input details are, 1234 : a0 : 12 

 DEBUG : Input details are, 1111 : b0 : 34
DEBUG: Input details are, 1234 : a0 : 12
DEBUG: Input details are, 1111 : b0 : 34
好的方面是,这种方法可以防止
IndexOutOfBoundsException
NullPointerException
。如果我们把第一行改成

def inputDetails = "1234-a0-12;1111-b0"
结果是:

DEBUG: Input details are, 1234 : a0 : 12
DEBUG: Input details are, 1111 : b0 : null

您好,欧内斯特,您关于拆分为2D数组的建议很有效,但结果是我的输入的数组形式:[[1234,a0,12],[1111,b0,34]]。我想将每个元素用于不同的目的,如何获得1234,a0,12。。作为独立的元素。@Yash它只是一个普通的列表列表。您只需对每个:
元素执行一次操作。每个{list->def a=list[0];def b=list[1],}…
您可以检查列表的长度以了解它包含多少元素。感谢您的帮助!感谢Szymon使问题陈述更有意义并提出了解决方案。groovy的原始作者没有决定改为
froody
,这是一个错失的机会