如何读取两个定界符之间的文件并将内容保存到String数组[关闭]

问题描述 投票:-5回答:2

我正在做一个项目,该项目需要我读取Java代码中的Java文件。我只对提取所述文件中main的内容感兴趣。我最初的想法是检测main关键字并进行读取,直到找到}为止,但我无法将其放到位。

我正在阅读的内容将始终具有以下格式:

package abc;
public class something {
    public static main void(String[] args) {
        //The information I want to save
    }
}

我注意到有一个主要建议,建议使用扫描仪来执行此操作,但是我看不到如何正确有效地执行此操作。

java string file extract
2个回答
1
投票

如何读取两个定界符之间的文件并将内容保存到字符串数组中

实现的简单方法是:

  1. 将整个文件内容读取为字符串。
  2. 使用模式提取所需的字符串;例如像这样的东西

       String contents = ...
       Matcher m = Pattern.compile("\\wmain\\w([^}]*)}").matcher(content);
       if (m.find()) {
           String matched = m.group(1);
           ...
       } else {
           ...
       }
    

    (这仅是出于对[[方法的解释,...并非可行的解决方案。]

我应该警告您,这种方法将不可靠。

  1. 搜索单词main将拾取该单词的所有其他形式;例如在注释,字符串文字,变量名等中。
  2. 搜索字符}将在注释和文字中拾取该字符。
  3. }之后的第一个main可能是main方法中嵌套块的结尾。

正确的方法是实现JAVA解析器。


[您说过,您认为编写Java解析器不值得。您不需要

write

解析器。您可以生成一个,也可以使用现有的生成内存中AST的解析器库。但是我想,如果此代码仅需要用于一组严格控制的输入,它可能是可行的。最后,您还没有说为什么要这样做。根据您对提取的源代码片段的处理方式,您可能可以采用其他方式来实现此目的。例如,您也许可以使用BCEL或类似的方法在字节码级别上找到并分离main方法。

0
投票
Stephen C的解决方案甚至无法编译。用Java编写RegExp时需要将反斜杠加倍。您还需要启用Multiline&Dotall。

这是一个有效的示例:

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)); } } }

但是,正如其他地方所指出的,这只会找到最简单的主要方法。
© www.soinside.com 2019 - 2024. All rights reserved.