ReplaceRegExp

說明

ReplaceRegExp 是基於目錄的任務,用於在選定的檔案或檔案組中將給定正規表示式的出現取代為替換模式。

只有當輸出檔案與現有檔案不同時才會寫入。這可防止基於未變更的檔案(已由這個任務重新產生)進行虛假的重新建置。為了評估檔案是否已變更,這個任務會在 暫存目錄 內建立原始檔案的預處理版本。

regexp 型別對應器 類似,這個任務需要支援的正規表示式程式庫和 org.apache.tools.ant.util.regexp.Regexp 的實作。請參閱 Regexp 型別 文件中的詳細資料。

參數

屬性 說明 必要
檔案 應取代正規表示式的檔案。 是,除非使用巢狀的 <fileset>
符合 在檔案中符合的正規表示式模式 是,除非使用巢狀的 <regexp>
取代 用於取代檔案中正規表示式的替換模式。 是,除非使用巢狀的 <substitution>
旗標 在符合正規表示式時使用的旗標。有關詳細資訊,請參閱 Perl 5 語法
g:全域取代。取代找到的所有出現
i:不分大小寫。在符合中不考慮大小寫
m:多行。將字串視為多行輸入,使用 ^$ 分別作為任何一行的開始或結束,而不是字串的開始或結束。
s:單行。將字串視為單行輸入,使用 . 符合任何字元,包括換行符號,而這通常不會符合。
按行 一次處理一行檔案,一次對一行執行取代 (true|false)。如果您只想取代每一行中正規表示式的第一次出現,這很有用,而這在將檔案視為整體處理時不容易做到。 否;預設為 false
編碼 檔案的編碼。自 Apache Ant 1.6 起 否;預設為 JVM 預設字元編碼
保留最後修改時間 即使檔案已修改,仍保留檔案時間戳記。自 Ant 1.8.0 起 否;預設為 false

範例

<replaceregexp file="${src}/build.properties"
               match="OldProperty=(.*)"
               replace="NewProperty=\1"
               byline="true"/>

在屬性檔案中將屬性名稱 OldProperty 的出現取代為 NewProperty,保留現有值,在檔案 ${src}/build.properties

指定為巢狀元素的參數

此任務支援巢狀 FileSet 元素。

自 Ant 1.8.0 起,此任務支援任何基於檔案系統的 資源集合 作為巢狀元素。

此任務支援巢狀 Regexp 元素,以指定正規表示式。您可以使用此元素來參照先前定義的正規表示式資料類型實例。

<regexp id="id" pattern="alpha(.+)beta"/>
<regexp refid="id"/>

此任務支援巢狀 substitution 元素,以指定取代模式。您可以使用此元素來參照先前定義的取代模式資料類型實例。

<substitution id="id" expression="beta\1alpha"/>
<substitution refid="id"/>

範例

在屬性檔中,將屬性名稱 OldProperty 的出現取代為 NewProperty,保留現有值,在目前目錄中所有以 .properties 結尾的檔案中

<replaceregexp byline="true">
    <regexp pattern="OldProperty=(.*)"/>
    <substitution expression="NewProperty=\1"/>
    <fileset dir=".">
        <include name="*.properties"/>
    </fileset>
</replaceregexp>

將所有空白(空白、標籤等)取代為一個空白,保留行分隔符號

<replaceregexp match="\s+" replace=" " flags="g" byline="true">
    <fileset dir="${html.dir}" includes="**/*.html"/>
</replaceregexp>

然後,輸入

<html>    <body>
<<TAB>><h1>    T E S T   </h1>  <<TAB>>
<<TAB>> </body></html>

轉換為

<html> <body>
 <h1> T E S T </h1> </body></html>

任務

<replaceregexp match="\\n" replace="${line.separator}" flags="g" byline="true">
    <fileset dir="${dir}"/>
</replaceregexp>

將所有 \n 標記(注意反斜線的引號)取代為換行符號。然後,輸入

one\ntwo\nthree

轉換為

one
two
three

請注意,插入換行符號可能會破壞檔案語法。例如在 XML 中

<root>
    <text>line breaks \n should work in text</text>
    <attribute value="but breaks \n attributes"/>
</root>