First, I would recommend avoiding ant-contrib, as it tends to promote bad practices in Ant scripts. Any sort of string manipulation can be accomplished through native Ant's filterchain types.
Regarding your regex, Wiktor's pattern works, but in this case I would prefer to use negative lookbehind.
Test Target:
<target name="replace-version">
<property name="pom.project.version1" value="1.1.1" />
<loadresource property="snapshotVersionRepl1">
<propertyresource name="pom.project.version1" />
<filterchain>
<tokenfilter>
<replaceregex pattern="(.*)(?<!-SNAPSHOT)$" replace="\1-SNAPSHOT" />
</tokenfilter>
</filterchain>
</loadresource>
<echo>${snapshotVersionRepl1}</echo>
<property name="pom.project.version2" value="1.1.1-SNAPSHOT" />
<loadresource property="snapshotVersionRepl2">
<propertyresource name="pom.project.version2" />
<filterchain>
<tokenfilter>
<replaceregex pattern="(.*)(?<!-SNAPSHOT)$" replace="\1-SNAPSHOT" />
</tokenfilter>
</filterchain>
</loadresource>
<echo>${snapshotVersionRepl2}</echo>
</target>
Output:
[echo] 1.1.1-SNAPSHOT
[echo] 1.1.1-SNAPSHOT
Note that < is used in place of < to avoid breaking the XML syntax.