2

我有一些问题replaceregexp。为了更容易理解,我将使用简单的示例,而不是真实的代码。

所以假设我有 2 个 java 文件:

第一类.java

/**
 * UNDESIRABLE COMMENTS ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ
 * ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ
 */
public class firstClass{
    public String firstFunction(){
         <instructions>
    }

    /**
    * My function's description that I want to keep
    */
    public String secondFunction(){
         <instructions>
    }
}

第二类.java

/**
 * UNDESIRABLE COMMENTS ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ
 * ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ
 */
public class secondClass{
    public String firstFunction(){
         <instructions>
    }
}

所以我想删除我项目中每个java文件的“不受欢迎的评论”部分,但我想用ANT来做,而不是手动。为此,我正在使用这个:

<replaceregexp flags="s">
    <regexp pattern="UNDESIRABLE COMMENTS.+\*/"/>
    <substitution expression="*/"/>
    <fileset dir=".">
        <filename name="*.java"/>
    </fileset>
 </replaceregexp>

我想要的是得到这个代码:

第一类.java

/**
 */
public class firstClass{
    public String firstFunction(){
         <instructions>
    }

    /**
    * My function's description that I want to keep
    */
    public String secondFunction(){
         <instructions>
    }
}

第二类.java

/**
 */
public class secondClass{
    public String firstFunction(){
         <instructions>
    }
}

它适用于 secondClass.java 但不适用于第一个文件。当有其他注释时会出现问题,例如函数的描述。文件 secondClass.java 结果很好,但在 firstClass.java 我得到了这个:

/**
    */
    public String secondFunction(){
         <instructions>
    }
}

从“不受欢迎的评论”开始到我的第二个功能描述结束之间的所有内容都被删除了。

所以问题是:当我的 replaceregexp 找到更多 */ 时,它会停在最后一个,并删除“UNDESIRABLE COMMENTS”和最后一个 */ 之间的所有内容。

您有什么解决方案可以删除“不良评论”和找到的第一个 */ 之间的内容吗?

4

1 回答 1

1

您的问题是+正则表达式中的量词是greedy ,并且在仍然匹配的同时会消耗尽可能多的输入。尝试

UNDESIRABLE COMMENTS.+?\*/

取而代之 -+?表示与+不情愿相同,即它将尽可能地匹配,同时仍会产生整个表达式的整体匹配。

于 2012-11-12T13:39:42.230 回答