我正在使用Jenkins进行一些自动化工作,在那里我像一样存储了模式和DB详细信息
存储在ANT属性${schemaValue}
中的[schema1:db1, schema2:db2]
<propertycopy name="schemaValue" from="${SchemaVariable}"/>
现在我正试图循环通过这个散列数组来执行连接,我试过
<for param="theparam" list="${schemaValue}">
<sequential>
<echo message="param: @{theparam}"/>
</sequential>
</for>
但这将${schemaValue}
视为字符串,而不是数组
对此提供帮助。
编辑
正如@AR.3所建议的,我已经尝试过
<propertyregex override="yes" property="paramValue" input="@{theparam}" regexp=".+:([^]]+)]?" replace="1"/>
<echo message="paramValue: ${paramValue}"/>
<propertyregex override="yes" property="paramKey" input="@{theparam}" regexp="[?([^[]+):]" replace="1"/>
<echo message="paramKey: ${paramKey}"/>
${paramValue}正确地为我提供了db1和db2的
${paramKey}抛出错误
Ant中没有标准编程语言中存在的严格意义上的数组概念。for
循环将简单地迭代由分隔符(默认分隔符为,
)分隔的字符串的元素。在您的情况下,它看起来更像是一个映射或键值对列表。
如果预期行为是打印映射中的值(db1
和db2
),则可以使用涉及正则表达式替换的附加步骤:
<for param="theparam" list="${schemaValue}">
<sequential>
<propertyregex override="yes"
property="paramValue" input="@{theparam}"
regexp=".+:([^]]+)]?" replace="1"/>
<echo message="param: ${paramValue}"/>
</sequential>
</for>
因此,最初包含在theparam
中的回声值将是[schema1:db1
和schema2:db2]
。模式.+:([^]]+)]?
将通过与匹配来与这些值匹配
- 一个或多个字符
- 接着是CCD_ 12
- 其次是非CCD_ 13字符
- 接着是零个或一个CCD_ 14
propertyregex
将第一组的值,即([^]]+)
匹配的值放入属性paramValue
中。这实际上是冒号后面的值。
运行它应该打印:
[echo] param: db1
[echo] param: db2
编辑:
要获取密钥,可以使用以下正则表达式:
<propertyregex override="yes" property="paramKey"
input="@{theparam}" regexp="[?([^[]+):[^]]+]?" replace="1"/>