2

我找不到使用 ant 删除空间的方法。(我不是说修剪,而是从 ~ 删除到 )

我想让一个项目与另一个项目有所不同。

例如:

我有以下代码。

.... doSomeThing;

//#removeStart

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

//removeEnd#

....doAnyThing..

如您所见,我想从//#removeStartto中删除//removeEnd#。我不确定会写多少代码,但是这两个标签内的所有代码都需要消失//#removeStart ... //removeEnd#。一个java文件中可以有多个。

这是我的测试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 个匹配项,那么从空间 1 到空间 2 的所有内容都消失了。(包括something!)我真正想要的是空间 1,2 消失了,但something应该保持原样。

我怎样才能修复它,以便它用 1 替换每个出现的 1 ?

4

2 回答 2

2

您的显式字符不匹配:您的正则表达式表示//##ExternRemove,而您的实际文本是//##removeStartor //#removeStart。如果这是一个实际的正则表达式,则显式字符需要完全相同。也不.匹配换行符,您需要特别包含它(例如[\s\S]*)。

最后,如果您可能有多对这种匹配,则应该使匹配不贪心(通常是通过添加?)。总而言之,您可能需要一个正则表达式,例如:

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

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

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

同样,这取决于非捕获匹配的 ant 术语。

于 2012-08-23T03:43:49.813 回答
0

我已经成功地做到了这一点:

foo.txt

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

构建.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 中执行此操作,因为我讨厌直接更改文件。不幸的是,我还没有想出办法做到这一点。

于 2012-08-23T04:12:36.520 回答