用于解析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
将匹配publi、public、publicccc。。。 您应该替换为(公共)?=>公开零或一次public*
- 对于
enum*
是正则表达式中的特殊字符,因此需要对其进行转义{
\{
(\s*([A-Z][A-Z_]*)\s*[,\}]\s*)
将匹配publi、public、publicccc。。。 您应该替换为(public)?=>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你说得对。我没有注意到这一点。我对旧版本的导入进行了注释,对最近的版本添加了注释。