ReplaceRegExp

描述

ReplaceRegExp 是一个基于目录的任务,用于在选定的文件或一组文件中用替换模式替换给定正则表达式的出现。

只有在输出文件与现有文件不同时才会写入输出文件。这可以防止基于未更改的文件的虚假重建,这些文件已由此任务重新生成。为了评估文件是否已更改,此任务将在 临时目录 中创建源文件的预处理版本。

regexp 类型映射器 类似,此任务需要一个支持的正则表达式库和一个 org.apache.tools.ant.util.regexp.Regexp 的实现。有关详细信息,请参阅 Regexp 类型 文档。

参数

属性 描述 必需
file 要替换正则表达式的文件。 是,除非使用嵌套的 <fileset>
match 要在文件(s)中匹配的正则表达式模式 是,除非使用嵌套的 <regexp>
replace 要替换到文件(s)中以代替正则表达式的替换模式。 是,除非使用嵌套的 <substitution>
flags 匹配正则表达式时要使用的标志。有关更多信息,请参阅 Perl 5 语法
g : 全局替换。替换找到的所有出现
i : 不区分大小写。在匹配中不考虑大小写
m : 多行。将字符串视为多行输入,使用 ^$ 分别作为任何行的开头或结尾,而不是字符串的开头或结尾。
s : 单行。将字符串视为单行输入,使用 . 匹配任何字符,包括换行符,通常情况下,它不会匹配。
byline 逐行处理文件(s),每次对一行执行替换 (true|false)。如果您只想替换每行上正则表达式的第一次出现,这很有用,这在将文件作为一个整体进行处理时并不容易做到。 否;默认为 false
encoding 文件的编码。自 Apache Ant 1.6 起 否;默认为默认 JVM 字符编码
preserveLastModified 即使文件(s)被修改,也要保留文件时间戳(s)。自 Ant 1.8.0 起 否;默认为 false

示例

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

在属性文件中用 NewProperty 替换属性名称 OldProperty 的出现,保留现有值,在文件 ${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"/>

示例

在当前目录中所有以 .properties 结尾的文件中,用 NewProperty 替换属性名称 OldProperty 的出现,保留现有值

<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>