Я попробовал несколько регулярных выражений, но не получил один для всех, ближайший был:
<replaceregexp file="props.txt"
match="(this.property=[,?\w+,?]*)monkey,(.*)"
replace="\1\2"
/>
обратите внимание на трейлинг ',' после обезьяны
case first item = обезьяна, вы должны использовать:
match="(this.property=[,?\w+,?]*)monkey,(.*)"<br>
, чтобы избавиться от ', в противном случае с:
match="(this.property=[,?\w+,?]*)monkey(.*)"
вы получите
this.property=,banana,peanuts,ape,tiger,what,the,heck
с использованием завершающего ',' после того, как удаляемый элемент будет работать для всех остальных элементов, например, банан, но не для
для последнего элемента.
case last item = heck:
match="(this.property=[,?\w+,?]*)heck,(.*)"
ничего не сделает
match="(this.property=[,?\w+,?]*)heck(.*)"
получит:
this.property=monkey,banana,peanuts,ape,tiger,what,the,
только:
match="(this.property=[,?\w+,?]*),heck"
будет работать.
Таким образом, нет общего решения из-за проблем с ','
Из-за этого нужно использовать более одного шага, чтобы он работал во всех случаях.
Итак, либо используйте несколько частей replaceregexp, либо сделайте наоборот, значит загрузите свой файл свойств, а затем отредактируйте свойство напрямую - propertyfileостаетсято же самое.
Так как свойства в ant являются неизменяемыми по своему дизайну, для достижения этого вам необходимо использовать Ant Addon или язык сценариев с доступом к ant api.
После макроопределения, работающего для всехслучаи, в которых используются Flaka :
<project xmlns:fl="antlib:it.haefelinger.flaka">
<property name="this.property" value="monkey,banana,peanuts,ape,tiger,what,the,heck"/>
<macrodef name="editcsvproperty">
<attribute name="csvproperty"/>
<attribute name="newproperty"/>
<attribute name="delete"/>
<sequential>
<fl:when test="'@{csvproperty}' eq '@{newproperty}'">
<echo>Overriding existing property => '@{csvproperty}' !!</echo>
</fl:when>
<fl:let>
; first delete item itself
@{newproperty} ::= replace(property['@{csvproperty}'], '', '@{delete}')
; take care of doubled ,,
@{newproperty} ::= replace(property['@{csvproperty}'], ',', ',,')
; take care of a leading ,
@{newproperty} ::= replace(property['@{csvproperty}'], '$1', '^,(.+)')
; take care of a trailing ,
@{newproperty} ::= replace(property['@{csvproperty}'], '$1', '(.+),$')
</fl:let>
</sequential>
</macrodef>
<editcsvproperty
csvproperty="this.property"
newproperty="this.property"
delete="heck"
/>
<echo>$${this.property} => ${this.property}</echo>
</project>