【发布时间】:2012-02-23 02:41:41
【问题描述】:
是否有任何工具/Eclipse 插件可以删除文件中的所有 JavaDoc cmets?
正常(非JavaDoc)cmets在运行该工具后应该是完整的。
【问题讨论】:
-
你说的是javadocs吗?
-
@DenisTulskiy 是的 javadocs.. 我的错
是否有任何工具/Eclipse 插件可以删除文件中的所有 JavaDoc cmets?
正常(非JavaDoc)cmets在运行该工具后应该是完整的。
【问题讨论】:
试试这个正则表达式在 eclipse / sed / 你最喜欢的支持正则表达式的编辑器中搜索替换。
/\*\*(?s:(?!\*/).)*\*/
?s 将输入视为单行\**
*/ 的负前瞻
*/
编辑
要解决字符串包含 javadoc 的情况,请使用此正则表达式
((?<!\\)"([^"]|(?<=\\)")*")|(/\*\*(?s:(?!\*/).)*\*/)
并用第一个捕获组替换它
/1
那么如果你说这不应该匹配
///** */
或更复杂的情况
我建议,使用像 antlr 这样的解析器工具来解析使用 java grammar for tokens like comments and strings 并删除你不想要的元素
有时我发现我自己的正则表达式答案很神秘!!
这里有一些视觉反馈
((?!\\)"([^"]|(?=\\)")*")|(/\*\*(?:(?!\*/).)*\*/)
/\*\*(?:(?!\*/).)*\*/
【讨论】:
String s = "/**asd*/";。它是一个字符串,它 not 是 javadoc 的一部分。但是它被替换了。
((?<!\\)"([^"]|(?<=\\)")*")|(/\*\*(?s:(?!\*/).)*\*/) 匹配普通字符串!它杀死了我所有的弦。
^[^"]*/\*\* 之类的东西来匹配javadoc cmets 的开头而不匹配字符串中的任何内容。
\1 而不是 /1。我会将此作为答案,直到其他人有一个不属于此类///**test*/ 的解决方案,谢谢!
Prashant Bhate 的答案在 Eclipse IDE 中对我不起作用:
/\*\*(?s:(?!\*/).)*\*/
我不得不使用
/\*/*(?s:(?!\*/).)*\*/
改为。
【讨论】:
为此我做了一个开源的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();
}
【讨论】:
以下在 vim 中对我有用:
/\/\*\*\_.\{-}\*\/
\_.\{-} 模式尽可能少地匹配任何字符 (.),包括换行符 (\_)。
这与多行 Javadoc cmets 匹配,例如:
/**
* My Javadoc comment here
*/
但不会匹配cmets如:
// My non-Javadoc comment
【讨论】:
/\/\*\*\_.\{-}\*\/only 进行搜索。在命令模式下写入 :%s/\s\+\/\*\*\_.\{-}\*\///g 以替换所有 Javadocs,包括前导空格。