删除字符串中的注释

时间:2013-08-04 06:47:46

标签: java regex string replace comments

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

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

5 个答案:

答案 0 :(得分: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; 
}

答案 1 :(得分:0)

怎么样......

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

   }

答案 2 :(得分:0)

替换以下代码

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

使用,

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

答案 3 :(得分:0)

您需要在(?s)正则表达式的开头使用partialFiltered,以允许跨多行注释(例如,请参阅Pattern.DOTALL with 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("//.*", "");

查找表示评论的字符也存在问题,例如:如果它们出现在字符串或正则表达式模式中,但我认为它们对你的应用程序并不重要 - 如果它们可能是使用简单正则表达式的结束,你可能需要一个解析器... < / p>

答案 4 :(得分:0)

也许这可以帮助某人:

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

使用此正则表达式来测试((['"])(?:(?!\2|\\).|\\.)*\2)|\/\/[^\n]*|\/\*(?:[^*]|\*(?!\/))*\*\/ here