2010-04-13 35 views
3

我有一個屬性,其值包含$。我想在propertyregexp中將此屬性用作正則表達式。 Ant似乎將該屬性解析爲propertyregexp的參數,但隨後美元被解釋爲正則表達符號。在螞蟻財產中間逃離一美元

例子:

<property name="a" value="abc$" /> 
<property name="b" value="xyz" /> 
<path id="paths"> 
    <pathelement location="abc$/def" /> 
    <pathelement location="abc$/ghi" /> 
</path> 
<pathconvert property="list" refid="paths" pathsep="${line.separator}" dirsep="/" /> 
<propertyregex property="list" input="${list}" override="true" regexp="${a}(.*)" replace="${b}\1" /> 
<echo message="${list}" /> 

我想獲得一對xyz/defxyz/ghi。這可能嗎?我正在使用Ant 1.8。

+0

不要反斜槓作爲轉義字符的幫助? – BalusC 2010-04-13 17:11:19

+1

美元可以逃脫,但只是在宣佈'a'的時候,我不控制這一點。 我也嘗試過使用另一個'propertyregex'操作來編輯'a'並給出'a.escaped'屬性,但是這似乎也不起作用。我試過這個變種: '' – 2010-04-13 17:17:49

回答

1

哎呀不知何故,我沒有閱讀所有的細節您的評論,但儘管如此,這裏的工作 玩具的解決方案;-)

<project name="project" default="main"> 

    <taskdef resource="net/sf/antcontrib/antlib.xml"/> 

<property name="a" value="abc$" /> 
<property name="b" value="xyz" /> 
<path id="paths"> 
    <pathelement location="abc$/def" /> 
    <pathelement location="abc$/ghi" /> 
</path> 

<target name="main"> 

    <pathconvert property="list" refid="paths" pathsep="${line.separator}" dirsep="/" /> 
    <propertyregex property="a" input="${a}" override="true" regexp="\$" replace="" /> 
    <propertyregex property="list" input="${list}" override="true" regexp="\$" replace="" /> 
    <propertyregex property="list" input="${list}" override="true" regexp="${a}" replace="${b}" /> 
    <echo>${list}</echo> 
</target> 

</project> 

結果:

main: 
    [echo] /foobar/AntScripts/xyz/def 
    [echo] /foobar/AntScripts/xyz/ghi 
BUILD SUCCESSFUL 

IMO,使用與性能'$'在呼喚麻煩,難道沒有其他辦法嗎?!

+0

正如我上面所說,只有當我控制'a'的定義時,這才起作用。在一個玩具的例子中,這很好,但是假設這個屬性來自其他地方,比如從其他地方貢獻出來的屬性文件沒有以這種方式逃脫美元。進一步假設它不能轉義它們,因爲這些屬性是從一個被轉義字符混淆的shell腳本中使用的。 – 2010-04-14 07:14:53

+0

這非常接近。爲了迂腐,這種錯失的情況就是我們不希望替換的屬性中有'$'的地方,所以爲了正確性,能夠在正則表達式中完全做到這一點是很好的。但它會爲我的目的。我完全同意,它是在呼喚麻煩,不幸的是它是我無法控制的文件系統的文件路徑的一部分,所以無論我喜歡與否,它都在那裏!感謝您的關注。 – 2010-04-15 11:38:48

+0

「我想要得到xyz/def和xyz/ghi這對,這可能嗎?」 你得到了你所要求的。 用於其他輸入|輸出您必須提供更多詳細信息/另一個 示例代碼段 – Rebse 2010-04-15 20:32:29

0

下面的代碼工作:

<property name="a" value="abc$" /> 
<property name="b" value="xyz" /> 
<path id="paths"> 
    <pathelement location="abc$/def" /> 
    <pathelement location="abc$/ghi" /> 
</path> 
<pathconvert property="list" refid="paths" pathsep="${line.separator}" dirsep="/" /> 
<propertyregex property="a.escaped" input="${a}" regexp="\$$" replace="\\\\$$" global="true" /> 
<propertyregex property="list" input="${list}" override="true" regexp="${a.escaped}(.*)" replace="${b}\1" /> 
<echo message="${list}" />