用于解析java枚举的正则表达式

用于解析java枚举的正则表达式,java,regex,enums,Java,Regex,Enums,各位! 我想使用一个正则表达式获取枚举常量 public*[ ]enum*[ ]DynamicVocabularyName[ ]*{([\ \n\r\t]*([A-Z\_]*)[ ]*\,)*[\ \n\r\t]* 输入: package ..; public enum DynamicVocabularyName { ACTIVE_CRIMES_COUNT, ACTIVE_CRIME_TYPE, APPLICATION_NAME, ARREST_COUNT,

各位!

我想使用一个正则表达式获取枚举常量

public*[ ]enum*[ ]DynamicVocabularyName[ ]*{([\ \n\r\t]*([A-Z\_]*)[ ]*\,)*[\ \n\r\t]*
输入:

package ..;

public enum DynamicVocabularyName {
    ACTIVE_CRIMES_COUNT,
    ACTIVE_CRIME_TYPE,
    APPLICATION_NAME,
    ARREST_COUNT,
    AREA_DESCRIPTION,
    AREA_NAME,
    BAD_PARAMETER_NAME,
    BATTERY_PERCENT,
    CAROWNER_PERSON_ADDRESS,
    CAROWNER_PERSON_FULLNAME,
    CAROWNER_PERSON_PHONE,
    CRIME_DATE_DESCRIPTION,
    CRIME_SUBTYPE,
}
所需输出-枚举值数组:

ACTIVE_CRIMES_COUNT
ACTIVE_CRIME_TYPE
APPLICATION_NAME
ARREST_COUNT
AREA_DESCRIPTION
...
但我只得到最后一个枚举值

如何修复我的正则表达式以获取所有值

链接到此示例:

您的问题不够清楚,而且您没有提供一些代码,因此如果我正确理解了您的问题,那么您可以使用如下正则表达式:

\b([A-Z_]+)\b

您的问题不够清楚,而且您还没有提供一些代码,因此如果我正确理解了您的问题,那么您可以使用如下正则表达式:

\b([A-Z_]+)\b

  • public*
    将匹配publi、public、publicccc。。。 您应该替换为(公共)?=>公开零或一次

  • 对于
    enum*

  • {
    是正则表达式中的特殊字符,因此需要对其进行转义
    \{

没有担保,似乎就足够了:

(\s*([A-Z][A-Z_]*)\s*[,\}]\s*)
  • public*
    将匹配publi、public、publicccc。。。 您应该替换为(public)?=>public零或一次

  • 对于
    enum*

  • {
    是正则表达式中的特殊字符,因此需要对其进行转义
    \{

没有担保,似乎就足够了:

(\s*([A-Z][A-Z_]*)\s*[,\}]\s*)

要捕获示例代码中的所有枚举常量,可以使用此正则表达式,该正则表达式基于在上一次匹配结束时断言位置的
\G

(?:\spublic\s+enum\s+DynamicVocabularyName\s*\{|\G,)\s+([A-Z_]+)(?=[^{}]*\})

要捕获示例代码中的所有枚举常量,您可以使用此正则表达式,该正则表达式基于在上一次匹配结束时断言位置的
\G

(?:\spublic\s+enum\s+DynamicVocabularyName\s*\{|\G,)\s+([A-Z_]+)(?=[^{}]*\})

如果您可能需要处理多个不同的Java源文件,那么值得一看

对于您当前的问题,解决方案可能如下所示

// mvn artefact: com.google.code.javaparser:javaparser
//import japa.parser.JavaParser;
//import japa.parser.ParseException;
//import japa.parser.ast.CompilationUnit;
//import japa.parser.ast.body.EnumConstantDeclaration;
//import japa.parser.ast.body.EnumDeclaration;
//import japa.parser.ast.body.TypeDeclaration;

// mvn artefact: com.github.javaparser:javaparser-core
import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseException;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.EnumConstantDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.body.TypeDeclaration;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List;

public class EnumNames {

    public static void main(String[] args) throws ParseException, IOException {
        String code = "public enum DynamicVocabularyName {\n"
                + "    ACTIVE_CRIMES_COUNT,\n"
                + "    ACTIVE_CRIME_TYPE,\n"
                + "    APPLICATION_NAME,\n"
                + "    ARREST_COUNT,\n"
                + "    AREA_DESCRIPTION,\n"
                + "    AREA_NAME,\n"
                + "    BAD_PARAMETER_NAME,\n"
                + "    BATTERY_PERCENT,\n"
                + "    CAROWNER_PERSON_ADDRESS,\n"
                + "    CAROWNER_PERSON_FULLNAME,\n"
                + "    CAROWNER_PERSON_PHONE,\n"
                + "    CRIME_DATE_DESCRIPTION,\n"
                + "    CRIME_SUBTYPE,\n"
                + "}";

        ByteArrayInputStream in = new ByteArrayInputStream(code.getBytes());
        CompilationUnit cu = JavaParser.parse(in);
        List<TypeDeclaration> types = cu.getTypes();
        for (TypeDeclaration type : types) {
            if (type instanceof EnumDeclaration) {
                List<EnumConstantDeclaration> enumConstants = 
                        ((EnumDeclaration) type).getEntries();
                for (EnumConstantDeclaration enumConstant : enumConstants) {
                System.out.println("enum constant: " + enumConstant.getName());
                }
            }
        }
    }
}

如果您可能需要处理多个不同的Java源文件,那么值得一看

对于您当前的问题,解决方案可能如下所示

// mvn artefact: com.google.code.javaparser:javaparser
//import japa.parser.JavaParser;
//import japa.parser.ParseException;
//import japa.parser.ast.CompilationUnit;
//import japa.parser.ast.body.EnumConstantDeclaration;
//import japa.parser.ast.body.EnumDeclaration;
//import japa.parser.ast.body.TypeDeclaration;

// mvn artefact: com.github.javaparser:javaparser-core
import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseException;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.EnumConstantDeclaration;
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.body.TypeDeclaration;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List;

public class EnumNames {

    public static void main(String[] args) throws ParseException, IOException {
        String code = "public enum DynamicVocabularyName {\n"
                + "    ACTIVE_CRIMES_COUNT,\n"
                + "    ACTIVE_CRIME_TYPE,\n"
                + "    APPLICATION_NAME,\n"
                + "    ARREST_COUNT,\n"
                + "    AREA_DESCRIPTION,\n"
                + "    AREA_NAME,\n"
                + "    BAD_PARAMETER_NAME,\n"
                + "    BATTERY_PERCENT,\n"
                + "    CAROWNER_PERSON_ADDRESS,\n"
                + "    CAROWNER_PERSON_FULLNAME,\n"
                + "    CAROWNER_PERSON_PHONE,\n"
                + "    CRIME_DATE_DESCRIPTION,\n"
                + "    CRIME_SUBTYPE,\n"
                + "}";

        ByteArrayInputStream in = new ByteArrayInputStream(code.getBytes());
        CompilationUnit cu = JavaParser.parse(in);
        List<TypeDeclaration> types = cu.getTypes();
        for (TypeDeclaration type : types) {
            if (type instanceof EnumDeclaration) {
                List<EnumConstantDeclaration> enumConstants = 
                        ((EnumDeclaration) type).getEntries();
                for (EnumConstantDeclaration enumConstant : enumConstants) {
                System.out.println("enum constant: " + enumConstant.getName());
                }
            }
        }
    }
}

您的java代码是什么?如果enum有字段,即
活动犯罪计数(“test”)
?@D.Sergeev您的意思是匹配
publi
publicc
,等等吗?
值()
和一些
toString
//code>名称()?恕我直言,但你为什么必须手工操作?这是家庭作业吗?如果不是,这是一个非常奇怪的要求。你的java代码是什么?如果enum有字段,即
活动犯罪计数(“test”)
?@D.Sergeev你的意思是匹配
publi
Public
,等等吗?
值有问题()
和一些
toString
/
name()
?不要粗鲁,但为什么必须手工完成?这是家庭作业吗?如果不是,这是一个非常奇怪的要求。指向项目的链接是正确的(它指向GitHub上的版本,是唯一维护的版本)但是代码引用的是旧版本,基本上是相同的代码,但是您应该将包从japa.parser更改为com.github。javaparser@FedericoTomassetti你说得对。我没有注意到这一点。我对旧版本的导入进行了注释,并为新版本添加了它们。指向项目的链接就是正确的(它指向GitHub上唯一维护的版本)但是代码引用的是旧版本,基本上是相同的代码,但是您应该将包从japa.parser更改为com.github。javaparser@FedericoTomassetti你说得对。我没有注意到这一点。我对旧版本的导入进行了注释,对最近的版本添加了注释。