如何在Ant中提取子字符串

时间:2009-06-03 15:19:43

标签: ant

有没有办法从Ant属性中提取子字符串并将该子字符串放入它自己的属性中?

6 个答案:

答案 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)并添加几个设置器(例如oldpropertynewproperty值)的原因是什么?

答案 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 属性将覆盖它,这样你就可以解决标准的蚂蚁问题 行为,意味着一旦设置属性是不可变的