Ant substring by position

2019-07-23 16:25发布

问题:

I need to extract a substring from property value by length, f.e. :

<property name="prop1" value="nameBLABLABLA" />

I want get the value

name

Is it possible without using javascript code ?

回答1:

Not with vanilla ant, you would need to add some Ant addon like
Antcontrib (latest release 2006 !) or Ant Flaka - means you'll need additional jars/libraries.
With using the jdk builtin Javascript engine it's as easy as :

<project>

<!-- create a macrodef for reuse -->
<macrodef name="getsubstring">
 <attribute name="src"/>
 <attribute name="from"/>
 <attribute name="to"/>
 <attribute name="result"/>
 <sequential>
  <script language="javascript">
   project.setProperty(
    "@{result}", "@{src}".substring(@{from},@{to})
    );
  </script>
 </sequential>
</macrodef>

<property name="foo" value="nameBLABLABLA"/>

<getsubstring src="${foo}" from="0" to="4" result="foobar"/>

<echo> $${foobar} => ${foobar}</echo>

</project>

No additional libraries needed.
Created a macrodef that works for properties respectively for strings in general.
The JavaScript engine understands Javascript and Java and you'll get full access to Ant api.



回答2:

I'd use JavaScript as in Rebse's answer, but there is a way to do this without it using <loadresource> and a <tokenfilter>. This uses start/length rather than from/to for the substring:

<macrodef name="getsubstring">
  <attribute name="src"/>
  <attribute name="start"/>
  <attribute name="length"/>
  <attribute name="result"/>
  <sequential>
    <loadresource property="@{result}">
      <string value="@{src}}" />
        <filterchain>
          <tokenfilter>
            <replaceregex pattern="^.{@{start}}(.{@{length}}).*" replace="\1" />
          </tokenfilter>
        </filterchain>
    </loadresource>
  </sequential>
</macrodef>

<property name="prop1" value="nameBLABLABLA" />
<getsubstring src="${prop1}" start="0" length="4" result="p"/>
<echo message="${p}" />


标签: ant