Java - 在代码中查找注释的正则表达式

2022-09-03 00:04:32

这次使用Java有点乐趣。我想编写一个从标准输入(例如,逐行)读取代码的程序,例如:

// some comment
class Main {
    /* blah */
    // /* foo
    foo();
    // foo */
    foo2();
    /* // foo2 */
}

查找其中的所有注释并将其删除。我正在尝试使用正则表达式,现在我已经做了这样的事情:

private static String ParseCode(String pCode)
{
    String MyCommentsRegex = "(?://.*)|(/\\*(?:.|[\\n\\r])*?\\*/)";
    return pCode.replaceAll(MyCommentsRegex, " ");
}

但它似乎不适用于所有情况,例如:

System.out.print("We can use /* comments */ inside a string of course, but it shouldn't start a comment");

与正则表达式不同的任何建议或想法?提前致谢。


答案 1

你现在可能已经放弃了这个,但我对这个问题很感兴趣。

我相信这是一个部分解决方案...

本机正则表达式:

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

在爪哇:

String clean = original.replaceAll( "//.*|(\"(?:\\\\[^\"]|\\\\\"|.)*?\")|(?s)/\\*.*?\\*/", "$1 " );

这似乎可以正确处理嵌入在字符串中的注释以及字符串中正确转义的引号。我扔了一些东西来检查,但不是详尽无遗的。

有一个折衷方案是,代码中的所有“”块最终都会在它们后面有空格。保持简单并解决问题将非常困难,因为需要干净利落地处理:

int/* some comment */foo = 5;

一个简单的 Matcher.find/appendReplacement 循环可以在用空格替换之前有条件地检查 group(1),并且只有几行代码。也许仍然比完全启动的解析器更简单。(如果有人感兴趣,我也可以添加匹配器循环。


答案 2

最后一个例子我认为没有问题:

/* we comment out some code
System.out.print("We can use */ inside a string of course");
we end the comment */

...因为注释实际上以 结尾。此代码不编译。"We can use */

但我还有另一个有问题的案例:

int/*comment*/foo=3;

您的模式会将其转换为:

intfoo=3;

...什么是无效代码。因此,最好将您的注释替换为 ." """