gpt4 book ai didi

java - 正则表达式:在 .java 文件中查找 Java 类的模式

转载 作者:行者123 更新时间:2023-11-29 10:03:47 25 4
gpt4 key购买 nike

我想在阅读 .java 文件时找到一个类的名称。我现在使用此正则表达式不返回任何匹配项:

\\s*[public][private]\\s*class\\s*(\\w*)\\s*\\{

到目前为止,这是我的代码:

import java.io.*;
import java.util.*;
import java.util.regex.*;


public class HW4Solution {

public static void main(String [] args){
//Prompt user for path to file.
File file = null;
Scanner pathScan = new Scanner(System.in);
while (file == null || !file.exists())
{
System.out.print("Enter valid file path: ");
file = new File(pathScan.next());
}
pathScan.close();
System.out.println("File: " + file.getPath() + " found.");

//Read file line by line into buffered reader
StringBuffer componentString = new StringBuffer(100);
String currentLine;
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(file.getPath()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}

//TODO: Find class declarations
//TODO: Find superclasses
//TODO: Find instance variable declarations
//TODO: Find method signatures
//TODO: Find access modifier
//TODO: Find return type
//TODO: Find method name

//Creating patterns to look for!
//Class declarations
Pattern classDeclarationPattern = Pattern.compile("\\s*[public][private]\\s*class\\s*(\\w*)\\s*\\{");
try {
while((currentLine = bufferedReader.readLine()) != null){
Matcher classDeclarationMatcher = classDeclarationPattern.matcher(currentLine);
if(classDeclarationMatcher.group(1) != null){
componentString.append("Found class declaration: " + classDeclarationMatcher.group(3) + "\n");
/*if(classDeclarationMatcher.group(5) != null){
componentString.append("\tsuperclass: " + classDeclarationMatcher.group(5) + "\n");
}*/
System.out.println(classDeclarationMatcher.group());
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally{
try{
if (bufferedReader !=null) {
bufferedReader.close();
}
}
catch(IOException e){
e.printStackTrace();
}
}

System.out.println(componentString.toString());

}
}

我最终希望能够确定一个类声明是否有一个父类(super class)并获得它,但现在我在获取类名时遇到了很多麻烦(我不应该这样做)。

最佳答案

[public] 与您认为的不匹配。它是一个字符类,匹配 public 中的任何一个字符。您应该使用 pipe 来匹配备选词。

您可以使用以下正则表达式,扩展以考虑 super 类或接口(interface):-

Pattern.compile("\\s*(public|private)\\s+class\\s+(\\w+)\\s+((extends\\s+\\w+)|(implements\\s+\\w+( ,\\w+)*))?\\s*\\{");

请注意,在匹配 public|privateclass< 之间的空格时,您应该使用带有 + 量词的 \\s+/ 关键字。因为您希望那里至少有 1 空间。 \\s* 将匹配 0 空格,这是不正确的,因为 publicclass 无效。

除此之外,这里还可以考虑更多选项。像 static inner classesgeneric classes 一样,需要对其进行少量修改,您可以自行完成。我刚刚对如何处理给出了一些见解。


还有一件很重要的事情。在从组中获取结果之前,您应该调用 Matcher#find() 方法进行实际匹配。

关于java - 正则表达式:在 .java 文件中查找 Java 类的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com