Implements *nix shell-inspired string ops.

Simple operations

Substring property foo from index start for length len:


Evaluate to "defaultfoo" if foo not set:


Default unset property foo to "defaultfoo" and return:


Fail build if property foo unset:

${foo:?optional error message}

Evaluate to "if-foo" if property foo set:



The patterns used for deletion and replacement are *nix-style; i.e. Ant patternset syntax without ** support. File separators are transparently merged. Characters used in the expressions themselves can be specified by backslash escaping.

Delete shortest leading match:

      <!-- given ${x}=foo/bar/baz.ext -->
      ${x#*/} <!-- yields bar/baz.ext -->

Delete longest leading match:

      <!-- given ${x}=foo/bar/baz.ext -->
      ${x##*/} <!-- yields baz.ext -->

Delete shortest trailing match:

      <!-- given ${x}=foo/bar/baz.ext -->
      ${x%/*} <!-- yields foo/bar -->

Delete longest trailing match:

      <!-- given ${x}=foo/bar/baz.ext -->
      ${x%%/*} <!-- yields foo -->

Delete extension (using delete shortest trailing match):

      <!-- given ${x}=foo/bar/baz.ext -->
      ${x%.*} <!-- yields foo/bar/baz -->

Extract extension (using delete longest leading match):

      <!-- given ${x}=foo/bar/baz.ext -->
      ${x##*.} <!-- yields ext -->

Replace first occurrence of a pattern:

      <!-- given ${path}=org/apache/ant/props -->
      ${path/\//.} <!-- yields org.apache/ant/props -->

Replace all occurrences of a pattern:

      <!-- given ${path}=org/apache/ant/props -->
      ${path//\//.} <!-- yields org.apache.ant.props -->