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

bro*_*var 16 java regex search comments

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

// some comment
class Main {
    /* blah */
    // /* foo
    foo();
    // foo */
    foo2();
    /* // foo2 */
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

PSp*_*eed 25

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

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

原生正则表达式:

//.*|("(?:\\[^"]|\\"|.)*?")|(?s)/\*.*?\*/
Run Code Online (Sandbox Code Playgroud)

在Java中:

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

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

有一个折衷方案是代码中的所有""块都会以它们之后的空格结束.考虑到需要清洁处理,保持这种简单并解决该问题将非常困难:

int/* some comment */foo = 5;
Run Code Online (Sandbox Code Playgroud)

一个简单的Matcher.find/appendReplacement循环可以在替换为空格之前有条件地检查group(1),并且只能是少数几行代码.可能比完整的解析器更简单.(如果有人有兴趣,我也可以添加matcher循环.)


Sur*_*ran 0

另一种选择是使用一些支持 AST 解析的库,例如 org.eclipse.jdt.core 拥有执行此操作所需的所有 API 以及更多功能。但这只是一种选择:)