【问题标题】:Tool to remove JavaDoc comments?删除 JavaDoc 注释的工具?
【发布时间】:2012-02-23 02:41:41
【问题描述】:

是否有任何工具/Eclipse 插件可以删除文件中的所有 JavaDoc cmets?

正常(非JavaDoc)cmets在运行该工具后应该是完整的

【问题讨论】:

  • 你说的是javadocs吗?
  • @DenisTulskiy 是的 javadocs.. 我的错

标签: java eclipse javadoc


【解决方案1】:

试试这个正则表达式在 eclipse / sed / 你最喜欢的支持正则表达式的编辑器中搜索替换。

/\*\*(?s:(?!\*/).)*\*/
  • ?s 将输入视为单行
  • 一个起始字符串\**
  • 零个或多个
    • */ 的负前瞻
    • 空格或非空格字符
  • 一个尾随字符串*/

编辑

要解决字符串包含 javadoc 的情况,请使用此正则表达式

((?<!\\)"([^"]|(?<=\\)")*")|(/\*\*(?s:(?!\*/).)*\*/)

并用第一个捕获组替换它

/1

那么如果你说这不应该匹配

///** */

或更复杂的情况

我建议,使用像 antlr 这样的解析器工具来解析使用 java grammar for tokens like comments and strings 并删除你不想要的元素


有时我发现我自己的正则表达式答案很神秘!!

这里有一些视觉反馈

((?!\\)"([^"]|(?=\\)")*")|(/\*\*(?:(?!\*/).)*\*/)

Debuggex Demo


/\*\*(?:(?!\*/).)*\*/

Debuggex Demo

【讨论】:

  • 这不起作用。它错误地替换了字符串中的序列。例如,我有一个String s = "/**asd*/";。它是一个字符串,它 not 是 javadoc 的一部分。但是它被替换了。
  • ((?&lt;!\\)"([^"]|(?&lt;=\\)")*")|(/\*\*(?s:(?!\*/).)*\*/) 匹配普通字符串!它杀死了我所有的弦。
  • 您应该能够使用^[^"]*/\*\* 之类的东西来匹配javadoc cmets 的开头而不匹配字符串中的任何内容。
  • @Pacerier 是的,它确实匹配字符串,但是当您将其替换为捕获组 1 时,它(字符串)将被其自身替换!
  • @PrashantBhate 哦,对于 Eclipse 编辑器,它应该是 \1 而不是 /1。我会将此作为答案,直到其他人有一个不属于此类///**test*/ 的解决方案,谢谢!
【解决方案2】:

Prashant Bhate 的答案在 Eclipse IDE 中对我不起作用:

/\*\*(?s:(?!\*/).)*\*/

我不得不使用

/\*/*(?s:(?!\*/).)*\*/

改为。

【讨论】:

    【解决方案3】:

    为此我做了一个开源的library,它叫做CommentRemover,你可以删除单行和多行Java评论。

    它支持删除或不删除 TODO。
    它还支持 JavaScript 、 HTML 、 CSS 、 Properties 、 JSP 和 XML Comments。

    小代码sn-p怎么用(有2种用法):

    第一路内部路径

     public static void main(String[] args) throws CommentRemoverException {
    
     // root dir is: /Users/user/Projects/MyProject
     // example for startInternalPath
    
     CommentRemover commentRemover = new CommentRemover.CommentRemoverBuilder()
            .removeJava(true) // Remove Java file Comments....
            .removeJavaScript(true) // Remove JavaScript file Comments....
            .removeJSP(true) // etc.. goes like that
            .removeTodos(false) //  Do Not Touch Todos (leave them alone)
            .removeSingleLines(true) // Remove single line type comments
            .removeMultiLines(true) // Remove multiple type comments
            .startInternalPath("src.main.app") // Starts from {rootDir}/src/main/app , leave it empty string when you want to start from root dir
            .setExcludePackages(new String[]{"src.main.java.app.pattern"}) // Refers to {rootDir}/src/main/java/app/pattern and skips this directory
            .build();
    
     CommentProcessor commentProcessor = new CommentProcessor(commentRemover);
                      commentProcessor.start();        
      }
    

    第二种方式外部路径

     public static void main(String[] args) throws CommentRemoverException {
    
     // example for externalInternalPath
    
     CommentRemover commentRemover = new CommentRemover.CommentRemoverBuilder()
            .removeJava(true) // Remove Java file Comments....
            .removeJavaScript(true) // Remove JavaScript file Comments....
            .removeJSP(true) // etc..
            .removeTodos(true) // Remove todos
            .removeSingleLines(false) // Do not remove single line type comments
            .removeMultiLines(true) // Remove multiple type comments
            .startExternalPath("/Users/user/Projects/MyOtherProject")// Give it full path for external directories
            .setExcludePackages(new String[]{"src.main.java.model"}) // Refers to /Users/user/Projects/MyOtherProject/src/main/java/model and skips this directory.
            .build();
    
     CommentProcessor commentProcessor = new CommentProcessor(commentRemover);
                      commentProcessor.start();        
      }
    

    【讨论】:

    • 非常感谢,很棒的工具!
    【解决方案4】:

    以下在 vim 中对我有用:

    /\/\*\*\_.\{-}\*\/
    

    \_.\{-} 模式尽可能少地匹配任何字符 (.),包括换行符 (\_)。

    这与多行 Javadoc cmets 匹配,例如:

    /**
     * My Javadoc comment here
     */
    

    但不会匹配cmets如:

    // My non-Javadoc comment
    

    【讨论】:

    • String /\/\*\*\_.\{-}\*\/only 进行搜索。在命令模式下写入 :%s/\s\+\/\*\*\_.\{-}\*\///g 以替换所有 Javadocs,包括前导空格。
    猜你喜欢
    • 2011-08-02
    • 2015-11-02
    • 2016-07-19
    • 2013-12-15
    • 2012-05-08
    • 2012-03-17
    • 1970-01-01
    • 2011-07-23
    • 2016-07-25
    相关资源
    最近更新 更多