private static String filterString(String code) {
String partialFiltered = code.replaceAll("/\\*.*\\*/", "");
String fullFiltered = partialFiltered.replaceAll("//.*(?=\\n)", "");
return fullFiltered;
}
我尝试使用上面的代码删除字符串中的所有注释,但它不起作用 - 请帮忙。
答案 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