一点fun这次用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)/\*.*?\*/
In Java:
String clean = original.replaceAll( "//.*|(\"(?:\\\\[^\"]|\\\\\"|.)*?\")|(?s)/\\*.*?\\*/", "$1 " );
这似乎可以正确处理字符串中嵌入的注释以及字符串内正确转义的引号。我扔了一些东西来检查,但并不详尽。
存在一种折衷方案,即代码中的所有“”块最终都会在其后面留有空格。考虑到需要干净地处理,保持这个简单并解决该问题将非常困难:
int/* some comment */foo = 5;
一个简单的 Matcher.find/appendReplacement 循环可以在替换为空格之前有条件地检查 group(1),并且只需几行代码。也许仍然比完整的解析器更简单。 (如果有人感兴趣,我也可以添加匹配器循环。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)