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
,这是一个错失的机会