Search code examples
regexantant-contrib

ant-contrib for loop and regex in ant scripting


I have a requirement using ant, that the target should extract the two parameters passed as comma separated in a long list of similar pair of parameters passed which are semicolon separated. Currently I am doing something like this:

<?xml version="1.0"?>

<project name="" basedir="." default="test" xmlns:ac="antlib:net.sf.antcontrib">
<target name="test" >
<echo message="Hey There I am using What's App" />
<ac:for list="asdfg,dasfdf;vxxexqxx,hyyypyly;dksfgsgdgf,abaifuacu" delimiter=";" param="val">
<ac:sequential>
<ac:propertyregex property="param1"
            input="@{val}"
            regexp="([^\.]*)\,.*"
            select="\1"
            casesensitive="true" />
<ac:propertyregex property="param2"
            input="@{val}"
            regexp=".*,([^\.]*)"
            select="\1"
            casesensitive="true" />
<echo message = "val = ${param1}"/>
<echo message = "value = ${param2}"/>
</ac:sequential>
</ac:for>
</target>
</project>

But I am getting the output as:

Buildfile: /tmp/Manish/build.xml

test:
 [echo] Hey There I am using What's App
 [echo] val = asdfg
 [echo] value = dasfdf
 [echo] val = asdfg
 [echo] value = dasfdf
 [echo] val = asdfg
 [echo] value = dasfdf

So this is getting looped 3 times(correct) but by only the first value passed in the for loop parameter. Is there some obvious mistake I am making?

Thanks, Manish Joshi


Solution

  • Properties in Ant are immutable. You will need to use the variable task from ant-contrib (although it is discouraged) to unset the properties:

    <ac:for list="asdfg,dasfdf;vxxexqxx,hyyypyly;dksfgsgdgf,abaifuacu" delimiter=";" param="val">
    <ac:sequential>
    <ac:propertyregex property="param1"
                input="@{val}"
                regexp="([^\.]*)\,.*"
                select="\1"
                casesensitive="true" />
    <ac:propertyregex property="param2"
                input="@{val}"
                regexp=".*,([^\.]*)"
                select="\1"
                casesensitive="true" />
    <echo message = "val = ${param1}"/>
    <echo message = "value = ${param2}"/>
    <ac:var name="param1" unset="true"/>
    <ac:var name="param2" unset="true"/>
    </ac:sequential>
    </ac:for>