用于检测类/接口/etc声明的Java正则表达式

用于检测类/接口/etc声明的Java正则表达式,java,regex,Java,Regex,我正在尝试创建一个检测新类的正则表达式,例如: public interface IGame { 或 这是我到目前为止得到的,但它没有检测到: (line.matches("(public|protected|private|static|\\s)"+"(class|interface|\\s)"+"(\\w+)")) 谁能给我一些提示吗?像下面这样更改您的正则表达式,以匹配两种类型的字符串格式 line.matches("(?:public|protected|private|static

我正在尝试创建一个检测新类的正则表达式,例如:

public interface IGame {

这是我到目前为止得到的,但它没有检测到:

(line.matches("(public|protected|private|static|\\s)"+"(class|interface|\\s)"+"(\\w+)"))

谁能给我一些提示吗?

像下面这样更改您的正则表达式,以匹配两种类型的字符串格式

line.matches("(?:public|protected|private|static)\\s+(?:class|interface)\\s+\\w+\\s*\\{");
例如:

String s1 = "public interface IGame {";
String s2 = "private class Game {";
System.out.println(s1.matches("(?:public|protected|private|static)\\s+(?:class|interface)\\s+\\w+\\s*\\{"));
System.out.println(s2.matches("(?:public|protected|private|static)\\s+(?:class|interface)\\s+\\w+\\s*\\{"));
输出:

true
true

如下面所示更改正则表达式以匹配两种类型的字符串格式

line.matches("(?:public|protected|private|static)\\s+(?:class|interface)\\s+\\w+\\s*\\{");
例如:

String s1 = "public interface IGame {";
String s2 = "private class Game {";
System.out.println(s1.matches("(?:public|protected|private|static)\\s+(?:class|interface)\\s+\\w+\\s*\\{"));
System.out.println(s2.matches("(?:public|protected|private|static)\\s+(?:class|interface)\\s+\\w+\\s*\\{"));
输出:

true
true

这个正则表达式是一个不完整的Java类和接口声明规范。但是,它可以匹配如下声明:


抽象类X这个正则表达式是一个不完整的Java类和接口声明规范。但是,它可以匹配如下声明:



abstract类xfinal或abstract如何?泛型呢?您是否试图匹配这两种类型的字符串格式?正如我从您的另一个问题中了解到的,您希望对Java类的结构进行反向工程和分析/可视化。您要分析的代码是否语法正确,以便可以编译成Java字节码类文件(从类文件反向工程类依赖关系)?或者您需要处理一些热门的代码片段?我正试图将源代码文件的集合交给我的程序,我的程序将由此创建一个类图。我决定使用Jparser来读取文件,而不是使用正则表达式。那么final或abstract呢?泛型呢?您是否试图匹配这两种类型的字符串格式?正如我从您的另一个问题中了解到的,您希望对Java类的结构进行反向工程和分析/可视化。您要分析的代码是否语法正确,以便可以编译成Java字节码类文件(从类文件反向工程类依赖关系)?或者您需要处理一些热门的代码片段?我正试图将源代码文件的集合交给我的程序,我的程序将由此创建一个类图。我已经决定使用Jparser来读取文件,而不是使用正则表达式。这几乎是完美的,但不会出现像私有类SetupMouseListener扩展MouseApter这样的情况{对不起,我应该在原始示例中指定。我将尝试在我自己中添加它,但你没有将上面的内容放在你的正则表达式中。我只是修改了你的正则表达式,仅此而已。我不知道以下术语,如侦听器、适配器等。你可以根据需要修改上面的正则表达式。这远远不能检测到所有类数据定义,但问题为解释是否真的应该匹配所有声明留下了空间。您知道,还有
enum
@interface
。此外,类声明不需要任何
public
protected
private
static
,例如
clas Foo
是一个有效的类声明,但是一个类也可能有多个修饰符,就像在
私有静态最终类栏
中一样,我们并不是在谈论
private@Deprecated class ClassName
但是…这几乎是完美的,但它不会看到像私有类SetupMouseListener扩展MouseAdapter这样的情况{对不起,我应该在原始示例中指定。我将尝试在我自己中添加它,但你没有将上面的内容放在你的正则表达式中。我只是修改了你的正则表达式,仅此而已。我不知道以下术语,如侦听器、适配器等。你可以根据需要修改上面的正则表达式。这远远不能检测到所有类数据定义,但问题为解释是否真的应该匹配所有声明留下了空间。您知道,还有
enum
@interface
。此外,类声明不需要任何
public
protected
private
static
,例如
clas Foo
是一个有效的类声明,但一个类也可能有多个修饰符,如
私有静态最终类栏中的修饰符
,而且我们不是在谈论
private@Deprecated class ClassName
但是…这个正则表达式应该如何用于OP询问的检测,例如,正则表达式如何检测
“SetupMouseListener扩展了MouseAdapter”
?它可以确定给定的句子在语法上是否有效,但它如何检测其含义?(顺便说一句,看看如何从语法中派生正则表达式很有趣,但这还不足以使答案真正有用)@xmojmr:它捕获了extends子句和类名。只需输入源代码即可进行处理。如果您在答案中“只需输入一些源代码即可进行处理”,说明当它看到“
class SetupMouseListener extends MouseAdapter{}
“那我就把我的钱给你+1@xmojmr:完成。我的代码将返回
extensed MouseAdapter
,但通过对
Super
进行修改,您始终只能捕获
MouseAdapter
,该正则表达式如何用于OP询问的检测,例如,正则表达式如何检测
“setupmouseistener extensed MouseAdapter”
?它可以确定给定的句子在语法上是否有效,但它是如何检测其含义的?(顺便说一句:是的,看看如何从语法中派生正则表达式很有趣,但这还不足以让答案真正有用)@xmojmr:它捕获了extends子句和类名。只需输入源代码即可进行处理。如果您在答案中“只需输入一些源代码即可进行处理”,说明当它看到“
类SetupMouseListener extends MouseAdapter{}
”时,它是如何输出“SetupMouseListener”、“MouseAdapter”和“extends”的那我就给你我的+1@xmojmr:完成。我的代码将返回
扩展MouseAdapter
,但您始终只能捕获
MouseAdapter