有没有办法从Ant属性中提取子字符串并将该子字符串放入它自己的属性中?
答案 0 :(得分:36)
我使用scriptdef为substring创建一个javascript标记,例如:
<project>
<scriptdef name="substring" language="javascript">
<attribute name="text" />
<attribute name="start" />
<attribute name="end" />
<attribute name="property" />
<![CDATA[
var text = attributes.get("text");
var start = attributes.get("start");
var end = attributes.get("end") || text.length();
project.setProperty(attributes.get("property"), text.substring(start, end));
]]>
</scriptdef>
........
<target ...>
<substring text="asdfasdfasdf" start="2" end="10" property="subtext" />
<echo message="subtext = ${subtext}" />
</target>
</project>
答案 1 :(得分:22)
您可以尝试使用PropertyRegex from Ant-Contrib。
<propertyregex property="destinationProperty"
input="${sourceProperty}"
regexp="regexToMatchSubstring"
select="\1"
casesensitive="false" />
答案 2 :(得分:10)
由于我更喜欢使用vanilla Ant,因此我使用临时文件。无处不在,你可以利用replaceregex来摆脱你不想要想要的字符串部分。重置Git消息的示例:
<exec executable="git" output="${git.describe.file}" errorproperty="git.error" failonerror="true">
<arg value="describe"/>
<arg value="--tags" />
<arg value="--abbrev=0" />
</exec>
<loadfile srcfile="${git.describe.file}" property="git.workspace.specification.version">
<filterchain>
<headfilter lines="1" skip="0"/>
<tokenfilter>
<replaceregex pattern="\.[0-9]+$" replace="" flags="gi"/>
</tokenfilter>
<striplinebreaks/>
</filterchain>
</loadfile>
答案 3 :(得分:2)
我会选择蛮力并编写自定义Ant任务:
public class SubstringTask extends Task {
public void execute() throws BuildException {
String input = getProject().getProperty("oldproperty");
String output = process(input);
getProject().setProperty("newproperty", output);
}
}
实施String process(String)
并添加几个设置器(例如oldproperty
和newproperty
值)的原因是什么?
答案 4 :(得分:1)
我猜一个简单的简单方法是:
<loadresource property="destinationProperty">
<concat>${sourceProperty}</concat>
<filterchain>
<replaceregex pattern="regexToMatchSubstring" replace="\1" />
</filterchain>
</loadresource>
答案 5 :(得分:0)
我会为此目的使用脚本任务,我更喜欢ruby,例如 切断前3个字符=
<project>
<property name="mystring" value="foobarfoobaz"/>
<target name="main">
<script language="ruby">
$project.setProperty 'mystring', $mystring[3..-1]
</script>
<echo>$${mystring} == ${mystring}</echo>
</target>
</project>
输出=
main:
[echo] ${mystring} == barfoobaz
在现有的方法上使用带有project.setProperty()方法的ant api 属性将覆盖它,这样你就可以解决标准的蚂蚁问题 行为,意味着一旦设置属性是不可变的