爪哇 - 正则表达式查找代码中的注释

一点乐趣与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");

任何意见或想法的正则表达式有什么不同? 提前致谢。

--------------解决方案-------------

您可能已经放弃了这一点,但现在我很感兴趣的问题。

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

本机正则表达式:

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

在Java:

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

这似乎妥善处理的意见嵌入到字符串,以及正确地转义字符串引号内。 我把它的几件事情来检查,但不彻底。

有在所有的“”中的代码块将结束与后他们空间中的一个折衷。 保持这个简单而鉴于需要处理干净解决这一问题将是非常困难的:

int/* some comment */foo = 5;

一个简单的Matcher.find / appendReplacement循环使用空格替换之前,可以有条件地检查组(1),就只能是极少数行的代码。 还有比全面上涨解析器可能更简单。 (我可以添加匹配循环太多,如果有人有兴趣。)

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

/* 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;

...什么是无效的代码。 因此,更好地替换您的意见" "而不是""

我想使用正则表达式100%正确的解决方法是不人道的或不可能的(考虑到逃逸等)。

我相信会使用ANTLR-最好的选择,我相信他们甚至提供了一个Java的语法就可以使用。

另一种方法是使用一些库的支持AST解析,对于如org.eclipse.jdt.core拥有所有你需要做到这一点,更多的API。 但随后这只是一个选择:)

分类:java的 时间:2013-03-11 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.444 (s). 9 q(s)