-1
 private static String filterString(String code) {
     String partialFiltered = code.replaceAll("/\\*.*\\*/", "");
     String fullFiltered = partialFiltered.replaceAll("//.*(?=\\n)", "");
     return fullFiltered;
 }

我尝试使用上面的代码删除字符串中的所有注释,但它不起作用 - 请帮助。

4

5 回答 5

2

适用于两者// single和多行/* comments */

String sourceCode =
         "/*\n"
        + " * Multi-line comment\n"
        + " * Creates a new Object.\n"
        + " */\n"
        + "public Object someFunction() {\n"
        + " // single line comment\n"
        + " Object obj =  new Object();\n"
        + " return obj; /* single-line comment */\n"
        + "}";

System.out.println(sourceCode.replaceAll(
        "//.*|/\\*((.|\\n)(?!=*/))+\\*/", ""));

输入

/*
 * Multi-line comment
 * Creates a new Object.
 */
public Object someFunction() {
    // single line comment
    Object obj =  new Object();
    return obj; /* single-line comment */
}

输出

public Object someFunction() {

    Object obj =  new Object();
    return obj; 
}
于 2013-08-04T17:17:10.887 回答
0

您需要在正则表达式(?s)的开头使用partialFiltered以允许跨多行的注释(例如,请参阅Pattern.DOTALL 和 String.replaceAll)。

但是.*中间/\\*.*\\*/使用了一个贪婪的匹配,所以我希望它可以替换两个单独的注释块之间的全部内容。例如,给定以下内容:

/* Comment #1 */
for (i = 0; i < 10; i++)
{
    i++
}
/* Comment #2 */

没有对此进行测试,所以我冒着鸡蛋的风险,但希望它会删除包括中间代码在内的全部内容,而不仅仅是两个评论。一种防止方法是使用.*?使内部匹配非贪婪,即尽可能少地匹配:

String partialFiltered = code.replaceAll("(?s)/\\*.*?\\*/", "");

由于fullFiltered正则表达式不以 开头(?s),因此它应该在没有的情况下工作(?=\\n)(因为replaceAll正则表达式默认情况下不跨越多行) - 所以您应该能够将其更改为:

String fullFiltered = partialFiltered.replaceAll("//.*", "");

查找表示注释的字符也可能存在问题,例如,如果它们出现在字符串或正则表达式模式中,但我假设这些对您的应用程序并不重要——如果它们是,这可能是道路的尽头使用简单的正则表达式,您可能需要一个解析器...

于 2013-08-04T13:36:45.847 回答
0

怎么样....

      private static String filterString(String code) {
       return code.Replace("//", "").Replace("/*", "").Replace("*/", "");

   }
于 2013-08-04T06:49:25.017 回答
0

替换下面的代码

partialFiltered.replaceAll("//.*(?=\\n)", "");

和,

partialFiltered.replaceAll("//.*?\n","\n");

于 2013-08-04T06:51:17.577 回答
0

也许这可以帮助某人:

return code.replaceAll(
                "((['\"])(?:(?!\\2|\\\\).|\\\\.)*\\2)|\\/\\/[^\\n]*|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/", "$1");

使用这个正则表达式在((['"])(?:(?!\2|\\).|\\.)*\2)|\/\/[^\n]*|\/\*(?:[^*]|\*(?!\/))*\*\/ 这里测试

于 2016-07-21T09:17:03.103 回答