如何使用正则表达式在java代码中查找注释?
与//
和/* */
一样。
答案 0 :(得分:3)
虽然可以使用正则表达式解决,但解析任何类型的结构化标记时,最好的解决方案是使用实际理解所说语言的解析器。
在这种情况下:使用javaparser的ANTLR或基于Java grammar的自定义解决方案的Java Source Parser。
答案 1 :(得分:2)
试试这个:
public class Test {
// comment 1
/*
comment 2
// no line comment
*/
char c = '"'; // comment 3, " is not the start of a string literal!
String s = "/* no comment */ ... /*";
String t = "*/ also // not a comment";
private static String getContentsOf(String fileName) throws FileNotFoundException {
Scanner scan = new Scanner(new File(fileName));
StringBuilder b = new StringBuilder();
while(scan.hasNextLine()) {
b.append(scan.nextLine()).append("\n");
}
return b.toString();
}
public static void main(String[] args) throws FileNotFoundException {
String anyChar = "[\\s\\S]";
String singleLineComment = "//[^\r\n]*";
String multiLineComment = "/\\*" + anyChar + "*?\\*/";
String stringLiteral = "\"(?:\\\\.|[^\"\r\n\\\\])*\"";
String charLiteral = "'(?:\\\\.|[^'\r\n\\\\])+'";
String regex = String.format("(%s)|(%s)|(%s)|(%s)|(%s)",
singleLineComment, // group 1
multiLineComment, // group 2
stringLiteral, // group 3
charLiteral, // group 4
anyChar); // group 5
Matcher m = Pattern.compile(regex).matcher(getContentsOf("Test.java"));
while(m.find()) {
String matched = m.group();
if(m.group(1) != null || m.group(2) != null) {
System.out.println("matched = " + matched);
}
}
}
}
打印:
matched = // comment 1
matched = /*
comment 2
// no line comment
*/
matched = // group 1
matched = // group 2
matched = // group 3
matched = // group 4
matched = // group 5
或者,一个可能更强大的解决方案是使用一个小的解析器或解析器生成器。 ANTLR有一个很好的选择,只能定义语言语法的一部分而忽略其余部分。我在this previous Q&A中证明了这一点。缺点是你需要学习一点ANTLR ......
答案 2 :(得分:0)
查看上一个问题:Java - regular expression finding comments in code,或相关查询来自谷歌的某些随机链接:http://ostermiller.org/findcomment.html