Implements *nix shell-inspired string ops.
Substring property foo from index start for length len:
${foo:start:len}
Evaluate to "defaultfoo" if foo not set:
${foo:-defaultfoo}
Default unset property foo to "defaultfoo" and return:
${foo:=defaultfoo}
Fail build if property foo unset:
${foo:?optional error message}
Evaluate to "if-foo" if property foo set:
${foo:+if-foo}
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 -->