我正在做一个项目,该项目需要我读取Java代码中的Java文件。我只对提取所述文件中main
的内容感兴趣。我最初的想法是检测main
关键字并进行读取,直到找到}
为止,但我无法将其放到位。
我正在阅读的内容将始终具有以下格式:
package abc;
public class something {
public static main void(String[] args) {
//The information I want to save
}
}
我注意到有一个主要建议,建议使用扫描仪来执行此操作,但是我看不到如何正确有效地执行此操作。
如何读取两个定界符之间的文件并将内容保存到字符串数组中
实现的简单方法是:
使用模式提取所需的字符串;例如像这样的东西
String contents = ...
Matcher m = Pattern.compile("\\wmain\\w([^}]*)}").matcher(content);
if (m.find()) {
String matched = m.group(1);
...
} else {
...
}
(这仅是出于对[[方法的解释,...并非可行的解决方案。]
main
将拾取该单词的所有其他形式;例如在注释,字符串文字,变量名等中。}
将在注释和文字中拾取该字符。 }
之后的第一个main
可能是main方法中嵌套块的结尾。正确的方法是实现JAVA解析器。
write
解析器。您可以生成一个,也可以使用现有的生成内存中AST的解析器库。但是我想,如果此代码仅需要用于一组严格控制的输入,它可能是可行的。最后,您还没有说为什么要这样做。根据您对提取的源代码片段的处理方式,您可能可以采用其他方式来实现此目的。例如,您也许可以使用BCEL或类似的方法在字节码级别上找到并分离main
方法。这是一个有效的示例:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp {
public static void main(final String[] args) throws Exception {
final String code = "package abc;" + "\n"
+ "" + "\n"
+ "public class something {" + "\n"
+ "" + "\n"
+ "\t" + "public static void moth(String[] args) {" + "\n"
+ "\t\t" + "/* some code */" + "\n"
+ "\t" + "}" + "\n"
+ "\t" + "public static void main(String[] args) {" + "\n"
+ "\t\t" + "/* some code */" + "\n"
+ "\t" + "}" + "\n"
+ "\t" + "public static void meth(String[] args) {" + "\n"
+ "\t\t" + "/* some code */" + "\n"
+ "\t" + "}" + "\n"
+ "}" + "\n"
;
System.out.println(code);
final Pattern p = Pattern.compile("\\s(main\\s*\\(.+?})", Pattern.MULTILINE | Pattern.DOTALL);
final Matcher m = p.matcher(code);
if (m.find()) {
System.out.println(m.group(1));
}
}
}
但是,正如其他地方所指出的,这只会找到最简单的主要方法。