ant的replaceregexp,删除特定空间

时间:2012-08-23 03:33:49

标签: regex ant

我无法找到使用ant删除空间的方法。 (我不是指修剪,而是从〜去除)

我想让一个项目与另一个项目有一点区别。

例如:

我有以下代码。

.... doSomeThing;

//#removeStart

NotReleasedObject nro = new NotReleasedObject();
nro.doSomeThing();

//removeEnd#

....doAnyThing..

您可以轻松查看,我想从//#removeStart移至//removeEnd#。我不确定将编写多少代码,但这两个代码中的所有代码都需要消失。并且在一个java文件中可以有多个//#removeStart ... //removeEnd#

以下是我的测试replaceregexp代码:

<replaceregexp flags="s" replace="" byline="false" encoding="utf-8">
        <regexp pattern="//#removeStart.*//removeEnd#"/>
        <fileset dir="${extern-source-path}"/>
</replaceregexp>

------ source for victim.

//#removeStart
space 1
//removeEnd#

something

//#removeStart
space 2
//removeEnd#

现在我的代码工作不正常。标志-s有效,但如果一个文件有多个匹配,那么从空格1到空格2的所有内容都消失了。 (包括something!) 我真正想要的是空间1,2消失了,但something应保持不变。

如何修复它以便每次更换1次?

2 个答案:

答案 0 :(得分:2)

您的明确字符不匹配:您的正则表达式代表//##ExternRemove,而您的实际文字是//##removeStart//#removeStart。如果这是一个真正的正则表达式,那么显式字符必须完全相同。此外.与换行符不匹配,您需要明确包含该换行符(例如[\s\S]*)。

最后,如果您可能有多对此匹配,则应该使匹配非贪婪(通常是添加?)。总而言之,你可能想要一个正则表达式,如:

//##?removeStart[\s\S]*?//removeEnd##?

假设您希望允许1-2 #开始一行,并且该短语将始终为removeStart / removeEnd。否则你可以添加选项,例如

//##?(?:removeStart|ExternRemove)[\s\S]*?//(?:removeEnd|ExternEnd)##?

再次,这取决于非捕获匹配的蚂蚁术语。

答案 1 :(得分:0)

我成功地做到了这一点:

foo.txt的

This is a test
--->
###start remove
Blah blah blah
Yadda yadda yadda
###end remove
--->
End of my test

的build.xml

<project>
    <replaceregexp file="foo.txt"
        flags="s"
        match="###start remove.+###end remove"
        replace=""/>
</project>

产生的foo.txt

This is a test
--->

--->
End of my test

您的正则表达式看起来不太对劲。您正则表达式正在说##ExternRemove.*,但您的文件却改为//#removeStart

我看到我是否可以在副本或concat中执行此操作,因为我讨厌直接更改文件。不幸的是,我还没有找到办法做到这一点。