How to pull out a substring in Ant

2019-01-12 01:28发布

Is there a way to pull a substring from an Ant property and place that substring into it's own property?

标签: ant
5条回答
Evening l夕情丶
2楼-- · 2019-01-12 02:13

i would use script task for that purpose, i prefer ruby, example cut off the first 3 chars =

<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>

output =

main:
     [echo] ${mystring} == barfoobaz

using the ant api with method project.setProperty() on an existing property will overwrite it, that way you can work around standard ant behaviour, means properties once set are immutable

查看更多
Luminary・发光体
3楼-- · 2019-01-12 02:14

Since I prefer to use vanilla Ant, I use a temporary file. Works everywhere and you can leverage replaceregex to get rid of the part of the string you don't want. Example for munging Git messages:

    <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>
查看更多
祖国的老花朵
4楼-- · 2019-01-12 02:16

I would go with the brute force and write a custom Ant task:

public class SubstringTask extends Task {

    public void execute() throws BuildException {
        String input = getProject().getProperty("oldproperty");
        String output = process(input);
        getProject().setProperty("newproperty", output);
    }
}

What's left it to implement the String process(String) and add a couple of setters (e.g. for the oldproperty and newproperty values)

查看更多
祖国的老花朵
5楼-- · 2019-01-12 02:25

I use scriptdef to create a javascript tag to substring, for exemple:

 <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>
查看更多
别忘想泡老子
6楼-- · 2019-01-12 02:29

You could try using PropertyRegex from Ant-Contrib.

   <propertyregex property="destinationProperty"
              input="${sourceProperty}"
              regexp="regexToMatchSubstring"
              select="\1"
              casesensitive="false" />
查看更多
登录 后发表回答